如何从 Flask 中的帮助程序功能重定向



在许多表单上,我们都有一个取消按钮。试图保持干燥,似乎有一个辅助功能是有序的。函数 if_form_cancel() 将检查是否已单击取消按钮,然后相应地重定向(将目标传递给函数)。但是,当我们使用辅助函数时,重定向会被忽略(它内联工作得很好)。

view.py

from helper.py import if_form_cancel
...
def index():
    return render_template('index.html')
def edit():
    ...
    form = EditForm(obj=user, csrf_enabled=False)
    if request.method == 'POST':
        if_form_cancel(url_for('.index')) 
        if form.validate():
            ...
            return redirect(url_for('.index'))
        return render_template('edit.html')

helper.py

from flask import request, redirect, flash
def if_form_cancel(destination='/'):
    try:
        if request.form['cancel']:
            flash(u'Operation canceled at user request')
            return redirect(destination)
    except KeyError:
        pass

编辑.html

....
<input type="submit" name="submit" value="Submit" />
<input type="submit" name="cancel" value="Cancel" />
....

单击取消按钮时的结果:调用帮助程序函数,刷新正确消息,但不发生重定向。是否可以从这样的帮助程序函数重定向?如果是这样,怎么办?我们做错了什么?

您不会返回edit函数中if_form_cancel的结果。但是,您只想在用户取消时返回。一个例外在这里效果很好,看起来 werkzeug 有这样的例外。

看看这是否有效(未经测试)。

from werkzeug.routing import RequestRedirect
def if_form_cancel(destination='/'):
    try:
        if request.form['cancel']:
            flash(u'Operation canceled at user request')
            raise RequestRedirect(destination)
    except KeyError:
        pass

或者,您可以让form_cancel帮助程序检查表单,并在用户取消时返回 True,并在视图本身中执行重定向。

def edit():
    ...
    form = EditForm(obj=user, csrf_enabled=False)
    if request.method == 'POST': 
        if form_cancel():
            return redirect(url_for('.index'))
        if form.validate():
            ...
            return redirect(url_for('.index'))
        return render_template('edit.html')

此外,请考虑使用 validate_on_submit,而不是手动检查开机自检。

https://flask-wtf.readthedocs.org/en/latest/quickstart.html#validating-forms

最新更新