gpt4 book ai didi

python - Flask 应用仅在 wtforms 验证后提交目标 ="_blank"表单

转载 作者:太空宇宙 更新时间:2023-11-04 03:01:20 25 4
gpt4 key购买 nike

在我的 Flask 应用程序中,我有一个使用 wtformsjinja 模板生成的表单。如果验证通过,我想在新选项卡中重定向,否则我想留在同一页面上并显示错误。但是,如果我在我的表单中设置 target="_blank" ,它会打开一个新选项卡而不通过验证并在那里显示错误。删除 target="_blank" 不会打开新选项卡。有没有一种方法可以在不重写 js 中的整个验证的情况下实现这一目标?谢谢!

代码:

from wtforms import Form, TextAreaField, StringField, validators

class SubmitForm(Form):
field1 = StringField(u'field1', [validators.DataRequired()])
field2 = TextAreaField(u'field2', [validators.DataRequired()])

@app.route('/', methods=['POST'])
def sub():
form = SubmitForm(request.form)
if request.method == 'POST' and form.validate():
# great success
return redirect('/my_redirect_uri')
return render_template('index.html', form=form)

@app.route('/')
def layout():
return render_template('index.html', form=SubmitForm())

index.html:

{% from "_formhelpers.html" import render_field %}
<form method=post action="/" target="_blank">
<dl>
{{ render_field(form.field1) }}
{{ render_field(form.field2) }}
</dl>
<p><input type=submit value=Submit>
</form>

_formhelpers.html(不是那么相关,但为了完整起见):

{% macro render_field(field) %}
<dt>{{ field.label }}
<dd>{{ field(**kwargs)|safe }}
{% if field.errors %}
<ul class=errors>
{% for error in field.errors %}
<li>{{ error }}</li>
{% endfor %}
</ul>
{% endif %}
</dd>
{% endmacro %}

最佳答案

主要问题

您必须传递 form 对象以及表示表单字段的变量,即 field1field2

详情

上面所说的意味着你需要改变:

返回重定向('/my_redirect_uri')

返回重定向('/my_redirect_uri', form=form, field1=field1, field2=field2)

这也意味着你必须调整你的 View 方法:

@app.route('/', methods=['POST'])
def sub():
form = SubmitForm(request.form)
if request.method == 'POST' and form.validate():
# great success
field1 = form.field1.data
field2 = form.field2.data
return redirect('/my_redirect_uri', form=form, field1=field1, field2=field2)
return render_template('index.html', form=form)

现在您的程序有一些改进:

  • 无代码原则:

if request.method == 'POST' and form.validate(): 替换为 if form.validate_on_submit():(你保存一条指令)

为了scalability因为在程序的 future 版本和重新编辑中,使用 url_for() 时,对路由名称所做的任何更改都将自动可用,因为它使用 URL 映射生成 URL。您可以在 return redirect('/my_redirect_uri') 中使用它(您可以查看我提供的链接以获取更多信息)

  • 使用 session :

session 将使您的应用程序“能够记住”正在发送的表单数据。在您的示例中,您可以这样使用 session :

session['field1'] = form.field1.data
session['field2'] = form.field2.data

这意味着,例如,上面一行:

return redirect('/my_redirect_uri', form=form, field1=field1, field2=field2)

必须改为:

return redirect('my_redirect_uri', form=form, session.get('field1'), session.get('field2'))

请注意,如果要实现 session ,则需要设置一个 key ,因为它们存储在客户端,因此需要对其进行保护(在 Flask 的哲学中是加密的)。这意味着您必须以这种方式配置您的应用程序:

app.config['SECRET_KEY'] = 'some secret phrase of your own'

实际上,问题与您打开的浏览器选项卡无关。整个问题源于 redirect() 语句。

有关使用 session 的好处的更多详细信息?检查下一个最后部分:

关于重定向的一句话:

您的 POST 请求由 redirect 处理,因此当 POST 请求结束时您将失去对表单数据的访问权限。

重定向语句只是一个响应,当收到响应时,浏览器会发出一个 GET 请求。该机制主要用于以下(和类似)情况:

如果您尝试刷新您提交表单数据的同一个浏览器窗口,浏览器将提示您一个弹出窗口以确认您要(再次)发送数据,因为浏览器会记住,按照设计,它执行的最后一个请求。当然,这对您的应用程序的用户来说是令人讨厌的。我们需要 session 。这对于您重定向到的浏览器选项卡也很有帮助。

关于python - Flask 应用仅在 wtforms 验证后提交目标 ="_blank"表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40817966/

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