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

标签 python flask

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

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

@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/

相关文章:

python - 通过 Flask URL 传递对象

python - flask 在哪里寻找图像文件?

javascript - 连接两个动态创建的选择元素

python - MemoryError : ipython convnet module. 正常吗?

python - PyQt6在QSlider的paintEvent中设置自定义矩形

python - pip 安装来自 setup.py 的 tox 测试依赖项

python - 找不到正确的字符串结尾

python - Matplotlib 矩阵/图像明确说明轴值

python - 将 web dynos 添加到 Heroku flask 应用程序时出现“找不到该编队”错误?

python - flask restplus模型