redirect() / render_template() 从 Flask 中的同一路由调用时再次进入路由
redirect() / render_template() enters the route once again when called from the same route in 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 content
<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>
我创建了一个心愿单页面,其中列出了用户心愿单中的项目。用户可以通过单击删除按钮从心愿单中删除任何项目。单击删除按钮后,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 content
<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>