如何从Flask中的辅助函数重定向?

时间:2013-11-15 14:40:43

标签: python 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

edit.html

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

如果单击取消按钮,则结果:调用辅助函数,闪烁正确的消息,但不会发生重定向。是否可以从这样的辅助函数重定向?如果是这样的话?我们做错了什么?

1 个答案:

答案 0 :(得分:4)

您未在if_form_cancel函数中返回edit的结果。但是你只想在用户取消时返回。一个例外在这里工作得很好,看起来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而不是手动检查POST。

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