gpt4 book ai didi

python - 如何重写这个 Flask View 函数以遵循 post/redirect/get 模式?

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

我有一个小型日志浏览器。它根据用户的输入检索并显示以前记录的记录列表。它不会更新任何内容。

代码非常简单并且运行良好。这是一个简化版本:

@app.route('/log', methods=['GET', 'POST'])
def log():
form = LogForm()
if form.validate_on_submit():
args = parse(form)
return render_template('log.html', form=form, log=getlog(*args))
return render_template('log.html', form=form)

但是它不遵循 post/redirect/get 模式,我想解决这个问题。

在 post 和 get 之间,我应该在哪里存储发布的数据(即 args)?什么是标准或推荐方法?我应该设置一个cookie吗?我应该使用 flask.session 对象,在那里创建一个缓存吗?你能给我指出正确的方向吗?大部分时间我都在写后端...


更新:

我正在发布生成的代码。

@app.route('/log', methods=['POST'])
def log_post():
form = LogForm()
if form.validate_on_submit():
session['logformdata'] = form.data
return redirect(url_for('log'))
# either flash errors here or display them in the template
return render_template('log.html', form=form)

@app.route('/log', methods=['GET'])
def log():
try:
formdata = session.pop('logformdata')
except KeyError:
return render_template('log.html', form=LogForm())

args = parse(formdata)
log = getlog(args)
return render_template('log.html', form=LogForm(data=formdata), log=log)

最佳答案

所以,最终是 post/redirect/get pattern防止多次提交表单数据。由于您的 POST 此处实际上并未对数据库进行任何更改,因此您使用的方法似乎没问题。通常在模式中,POST 会更改基础数据结构(例如 UPDATE/INSERT/DELETE),然后在重定向上查询更新的数据 (SELECT),因此通常您不需要“存储”重定向和获取之间的任何内容。

综上所述,我的方法是使用 Flask session对象,这是 Flask 为您管理的 cookie。你可以这样做:

@app.route('/log', methods=['GET', 'POST'])
def log():
form = LogForm()
if form.validate_on_submit():
args = parse(form)
session['log'] = getlog(*args)
return redirect(url_for('log'))
saved = session.pop('log', None)
return render_template('log.html', form=form, log=saved)

此外,要使用 session ,您必须将 secret_key 设置为应用程序配置的一部分。

Flask Session API

2016 年 1 月 9 日更新

根据 ThiefMaster 的评论,重新安排了此处的逻辑顺序,以允许对无效表单提交使用 WTForms 验证方法,这样无效表单提交就不会丢失。

关于python - 如何重写这个 Flask View 函数以遵循 post/redirect/get 模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41533663/

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