如何在使用Flask和WTForms保留表单数据的同时进行重定向?

马图夫

让我们打开一个页面,上面有一张注册表。在部分中#registration如果用户提交了无效数据,则页面应将其返回到该#registration部分,并显示向其提交了无效值的字段。

我试图渲染模板并做出响应并重定向到它,但是我得到了TypeError

  File ".../app/routes.py", line 28, in index
    return redirect(url_for('.index', form=form, _anchor='registration'), 302, response)
  File ".../python3.7/site-packages/werkzeug/utils.py", line 507, in redirect
    mimetype="text/html",
TypeError: __call__() got an unexpected keyword argument 'mimetype'

该函数如下所示:

@app.route('/', methods=['GET', 'POST'])
def index():
    form = RegisterForm()
    if form.validate_on_submit():
        # everithing OK
        return redirect(url_for('.index', _anchor='registration'))

    # If form was submitted but contained invalid information
    if form.is_submitted():
        response = make_response(render_template('index.html', form=form))
        return redirect(url_for('.index', _anchor='registration'), 302, response)

    return render_template('index.html', form=form)
抽象的

您无法发送带有redirect响应的内容,只能说“转到此url”而且flask接受Response类(而不是实例)作为的参数redirect

要解决您的问题,您需要使用session(或简单地flashing)保留请求中的状态。

这是一个原型:

from flask import Flask, render_template_string, request, session, redirect
from werkzeug import MultiDict

from flask_wtf import FlaskForm
from wtforms import StringField, IntegerField
from wtforms.validators import AnyOf

app = Flask(__name__)
app.secret_key = 'secret'

class MyForm(FlaskForm):
    name = StringField('name', validators=[AnyOf(['secretname'])])

@app.route('/', methods=['POST', 'GET'])
def form():
    form = MyForm()
    html = '''
    {% for error in form.name.errors %} <span>{{ error }}</span> {% endfor %}
    <form method="POST" action="/">
        {{ form.csrf_token }}
        {{ form.name.label }} {{ form.name(size=20) }}
        <input type="submit" value="Go">
    </form>
    '''

    if request.method == 'GET':
        formdata = session.get('formdata', None)
        if formdata:
            form = MyForm(MultiDict(formdata))
            form.validate()
            session.pop('formdata')
        return render_template_string(html, form=form)

    if form.validate_on_submit():
        # use the form somehow
        # ...
        return redirect('/#registered')

    if form.is_submitted() and not form.validate():
        session['formdata'] = request.form
        return redirect('/#invalid')

if __name__ == "__main__":
    app.run()

运行服务器时,您将获得:
在此处输入图片说明

提交无效的表单后,您将重定向到,/#invalid并按预期填充表单:

无效的提交

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Symfony 2:跨重定向保留表单数据

如何在保留现有表单数据的同时使用JavaScript将输入节点附加到表单?

如何在Django中使用表单错误进行重定向?

如何同时发送数据和重定向?

重定向后Golang大猩猩会话保留表单数据

Flask 表单数据传递到数据库并重定向到主页

如何同时使用正文和表单数据发出 axios post 请求?

如何在 Flask 中使用重定向?

如何在Flask中获取表单数据?

如何在Flask函数中读取隐藏的表单数据

您如何使用action属性发送html表单数据而不重定向到另一页?

重定向到表单提交页面并在新页面中使用表单数据

Flask - 使用表单获取数据并重定向

如何在维护原始URL的同时使用.htaccess进行重定向

如何使用fetch进行多部分/表单数据标头和FormData的POST

重定向时如何保留表单的值

在上传图像的同时保留其他表单数据

回显错误,而不重定向到另一页,并保留所有表单数据?

成功提交表单数据后如何重定向用户?

Apache .htaccess重定向删除表单数据

如何使用Vue对表单数据进行分组

如何在React中使用获取和表单数据来发布对象?

.htaccess重定向+重写:在保留初始uri的同时,使用语言代码对uri进行前缀

如何在 FLASK 中更快地 POST 和重定向

无法使用 Flask 读取表单数据

如何在Alamofire中使用表单数据

如何使用Flurl上传文件和表单数据?

如何使用React Native和Axios发送表单数据?

在重定向中将 Flask-WTForms 表单中的复选框值传递回相同的表单