redirect()/render_template()从Flask的同一路由调用时再次进入路由



我创建了一个心愿单页面,列出了用户心愿单上列出的项目。用户可以通过单击"删除"按钮从愿望列表中删除任何项目。单击删除按钮后,HTML<form>将其提交给后端应用程序。然后,后端应用程序从心愿单数据库中删除该项目,并使用return redirect(url_for('wishlist'))重定向回同一页面。

我面临的问题是,如果用户在从愿望列表中删除项目后返回,他必须返回两次才能到达用户所在的页面。这是由于我在删除显示更新的愿望列表所需的项目后执行的重定向造成的。

我也尝试过render_template()而不是redirect(),但它也造成了同样的问题。

后端代码:

@app.route('/wishlist/',methods=['GET','POST'])
@login_required
def wishlist():
userid=current_user.get_id()
if request.method=='POST':
toRemove=request.form['remove']
deleteWish=session.query(Wishlist).filter_by(userId=userid,productId=toRemove).one()
session.delete(deleteWish)
session.commit()
return redirect(url_for('wishlist'))
subquery=session.query(Wishlist.productId).filter(Wishlist.userId==userid).subquery()
wishes=session.query(Products).filter(Products.id.in_(subquery))
return render_template("wishlist.html",wishes=wishes)

HTML:

<html>
<body>
{% for wish in wishes %}
<img src={{wish.image_path}} width="150" height="200">
</br>
{{wish.material}}
{{wish.productType}}
</br>
{{wish.price}}
</br>
<form action="{{url_for('wishlist')}}" method="POST" target="_self">
<button name="remove" type="submit" value="{{wish.id}}">Remove</button>
</form>
</br>
{% endfor %}
</body>
</html>

请给我一个防止这种情况发生的方法。

您可能需要创建一个不同的端点来删除愿望。删除完成后,此端点将重定向到您的愿望列表。

FLASK

@app.route('/wishlist/',methods=['GET','POST'])
@login_required
userid=current_user.get_id()
def wishlist():
subquery=session.query(Wishlist.productId).filter(Wishlist.userId==userid).subquery()
wishes=session.query(Products).filter(Products.id.in_(subquery))
return render_template("wishlist.html")
@app.route('/deletewish', methods = ['GET', 'POST']
def deletewish():
if request.method=='POST':
toRemove=request.form['wish_delete_id']    
deleteWish=...
session.delete(deleteWish)
session.commit()
return redirect(url_for('wishlist'))

HTML

<html>
<body>
{% for wish in wishes %}
<img src={{wish.image_path}} width="150" height="200">
</br>
{{wish.material}}
{{wish.productType}}
</br>
{{wish.price}}
</br>
<form method="POST" target="_self">
<button class="remove_wish" type="submit" value={{wish.id}}>Remove</button>
</form>
</br>
{% endfor %}`
<script src='path_to_jquery.js'></script>
<script src='path_to_deletewish.js'></script>
</body>
</html>

JS//deletewish.JS内容

<script>
$(document).ready(function() {
$('.remove_wish').click(function (event) {
event.preventDefault();
$.ajax({
data : {
wish_delete_id : $(this).val();
},
type : 'POST',
url : '/deletewish',
success: function (data) {
location.reload();
},
error: function (e) {
alert('something went wrong')
}
});
});
})
</script>

最新更新