gpt4 book ai didi

python - WTForms 双重 POST 提交防止刷新 flask-wtf

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

我使用 WTForms 和带有 Flask-WTF 扩展的 Flask

我的表格看起来像:

class CommentForm(Form):
body = TextAreaField('Body', [validators.Length(min=4, max=300)])
entity_id = HiddenField('Entity ID', [validators.required()])

Jinja2 模板:

 <form method="POST" action="{{ request.url }}#comment-question" id="comment-question">
<div>{{ comment_form.body }} <button type="submit">Submit</button></div>
{{ comment_form.entity_id(value=question.id) }}
{{ comment_form.hidden_tag() }}
</form>

呈现形式:

<form method="POST" action="http://localhost:5000/answers/1/question-0#comment-question" id="comment-question">
<div><textarea id="body" name="body"></textarea> <button type="submit">Submit</button></div>
<input id="entity_id" name="entity_id" type="hidden" value="1">
<div style="display:none;"><input id="csrf_token" name="csrf_token" type="hidden" value="20120507081937##ee73cc3cfc053266fef78b48cc645cbf90e8fba6"><input id="entity_id" name="entity_id" type="hidden" value=""></div>
</form>

是否可以在不更改表单“操作”和进行重定向的情况下防止在浏览器刷新按钮上单击双重表单提交?

最佳答案

我没有太多使用 WTForms 或 Flask 的经验,但基于 Django 类的 View 通过在 POST 后重定向来防止重复发布,所以我假设执行重定向是解决此类问题的方法。

一种替代方法是生成一个唯一的 token 并将其附加到您的表单参数(很像 CSRF token )。缓存此值并在提交表单时对其进行检查。 Django 的一个相当原始的例子 can be found here .

编辑:示例代码

虽然我真的只是在成功提交表单后执行重定向,但这里有一个生成表单标记的示例,该标记大量借鉴自 this Flask snippet on CSRF protection。 :

# yourapp/views/filters.py

import random
from string import ascii_letters, digits

from flask import request, session, redirect
from yourapp import app


def generate_form_token():
"""Sets a token to prevent double posts."""
if '_form_token' not in session:
form_token = \
''.join([random.choice(ascii_letters+digits) for i in range(32)])
session['_form_token'] = form_token
return session['_form_token']


@app.before_request
def check_form_token():
"""Checks for a valid form token in POST requests."""
if request.method == 'POST':
token = session.pop('_form_token', None)
if not token or token != request.form.get('_form_token'):
redirect(request.url)


app.jinja_env.globals['form_token'] = generate_form_token

在你的模板中:

<!-- Again, I've never used WTForms so I'm not sure if this would change when using that app. -->
<input type='hidden' name='_form_token' value='{{ form_token() }}' />

注意使用the snippet中的CSRF保护方式也实现了几乎相同的效果(尽管上面的代码执行重定向,而代码片段返回 403)。

但这确实引出了一个问题——如果您在无效 token 上执行重定向,为什么不摆脱所有这些复杂性并仅在成功提交表单时重定向?

关于python - WTForms 双重 POST 提交防止刷新 flask-wtf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10476836/

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