gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 21:55:21 33 4
gpt4 key购买 nike

让我们创建一个带有注册表单的页面。它位于#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)

最佳答案

您无法发送带有重定向响应的内容,您只能说“转到此网址”。 Flask 还接受 Response 类,而不是实例作为重定向的参数。

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

这是一个原型(prototype):

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_page():
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()

当你运行服务器时,你会得到:
enter image description here

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

invalid submission

关于python - 如何使用 Flask 和 WTForms 在保留表单数据的同时进行重定向?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56904775/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com