【问题标题】:redirect() / render_template() enters the route once again when called from the same route in Flaskredirect() / render_template() 在Flask中从同一路由调用时再次进入路由
【发布时间】:2020-11-28 11:17:18
【问题描述】:

我创建了一个愿望清单页面,其中列出了用户希望列出的项目。用户可以通过单击“删除”按钮从愿望清单中删除任何项目。单击删除按钮后,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>

请给我建议一种方法来防止这种情况发生。

【问题讨论】:

  • 您可以让 AJAX 处理您的提交,然后重新加载页面。

标签: python flask redirect post back


【解决方案1】:

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

烧瓶

@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>

【讨论】:

  • 试过了,但问题仍然存在,因为您在从deletewish() 的愿望清单中删除该项目后也在重定向。由于用户将首先进入愿望清单页面,然后如果用户删除一个项目,他会再次被重定向到愿望清单页面,因此他需要返回两次才能到达他进入愿望清单的页面。
  • 如果你愿意,我可以指导你使用 AJAX 和 jQuery
  • 是的,这将是一个很大的帮助!
  • 感谢更新!!但我面临一个问题:当我单击删除按钮时,出现以下错误:NoResultFound: No row was found for one()。每次单击“删除”按钮时,toRemove=request.form['wish_delete_id'] 也是无。
  • 我更新了我的代码以在单击删除按钮时显示警报。检查警报的内容是否与wish-id相对应。
猜你喜欢
  • 1970-01-01
  • 2018-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-16
  • 1970-01-01
相关资源
最近更新 更多