如何重写此 Flask 视图函数以遵循 post/redirect/get 模式?

2023-11-23

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

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

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

但是它不遵循发布/重定向/获取模式,我想解决这个问题。

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


UPDATE:

我正在发布结果代码。

@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这里实际上并没有对数据库进行任何更改,您使用的方法看起来不错。通常在模式中POST对底层数据结构进行更改(例如 UPDATE/INSERT/DELETE),然后在重定向上查询更新的数据 (SELECT),因此通常不需要在重定向和获取之间“存储”任何内容。

话虽这么说,我的方法是使用 Flasksessionobject,这是 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)

另外,要使用会话,您必须有一个secret_key设置为应用程序配置的一部分。

Flask 会话 API

2016 年 1 月 9 日更新

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何重写此 Flask 视图函数以遵循 post/redirect/get 模式? 的相关文章

随机推荐

  • 在 IE6 中调试 JavaScript [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我正在寻找一个可以调试 JavaScript 的工具withinIE6 我的意思是我希望调试器在浏览器中运行 a l 萤火虫 到目前为止我已经尝试过
  • Dojo AMD:无法在 require 中调用函数

    我确实是 dojo 的新手 但当我开始使用 dojo 版本 1 7 2 开发新应用程序时 我也想使用新的 AMD 函数语法 不幸的是我似乎不明白 最让我烦恼的是我不能简单地调用 require 块内的任何函数 例如 我有一个页面 打开时会创
  • 按下后退按钮时如何保留可滚动区域的滚动位置?

    我在一个大的可滚动 div 中有一长串链接 每次当用户单击链接然后单击后退按钮时 它都会从 div 的最顶部开始 这对我们的用户来说并不友好 有什么方法可以让浏览器在按后退按钮时滚动到上一个位置 非常感谢 在页面卸载期间 获取滚动位置并将其
  • pyplot:以 e 为基数的 loglog()

    Python 和 matplotlib 新手是从 R 过来的 所以我希望这个问题不是太白痴 我正在尝试在自然对数刻度上绘制对数对数图 但经过一番谷歌搜索后 我无法弄清楚如何强制 pyplot 在轴上使用基本 e 刻度 我目前拥有的代码 im
  • 在 Tensorflow 中使用字符串标签

    我仍在尝试使用自己的图像数据运行 Tensorflow 我能够使用此示例中的conevert to 函数创建一个 tfrecords文件link 现在我想用该示例中的代码来训练网络link 但在 read and decode 函数中失败
  • 如何序列化第三方不可序列化的最终类(例如google的LatLng类)?

    我在用着Google 的 LatLng 类来自 v2 Google Play 服务 该特定类是最终类 未实现java io Serializable 有什么办法可以做到吗LatLng类工具Serializable public class
  • 如何在静态库中存储版本号?

    如何将版本号存储在静态库 file a 中 然后在 Linux 中检查其版本 附 我需要能够随时检查文件的版本 而无需仅使用 shell 实用程序使用任何特殊的可执行文件 除了提供 Puppe 提到的静态字符串之外 通常的做法是提供一个宏来
  • 齐射请求的匿名侦听器导致内存泄漏

    我正在使用 volley 库进行网络服务调用 我创建了一个通用类来进行所有 Web 服务调用并从那里进行服务调用 并为成功和错误响应创建了匿名侦听器 但是当我使用泄漏金丝雀时 它显示与上下文相关的内存泄漏 下面是我的代码片段 public
  • Hive 中的“InputFormat、OutputFormat”和“Stored as”有什么区别?

    我是大数据新手 目前正在学习 Hive 我理解 Hive 中的 InputFormat 和 OutputFormat 的概念是 SerDe 的一部分 我还了解到 存储为 用于以特定格式存储文件 就像 InputFormat 一样 但我不明白
  • C++ 算术运算符

    刚刚在技术面试中被问到了一个让我有点困惑的问题 问题如下 If int i 1 int j 1 and int k 1 我们运行以下行 i j k i j 和 k 的新值是多少 我感到困惑的原因是 由于我们没有将此表达式分配给任何东西 因此
  • 在 Android 视图中使用 UI 元素进行测试

    我正在尝试使用以下测试用例测试简单的 UI 主要思想是在测试中设置一些 UI 文本 以模拟用户输入 然后主动单击事件 public class StackTestCase extends ActivityInstrumentationTes
  • 如何阻止 Chrome 和 Opera 按索引 ASC 对 JSON 对象进行排序?

    我有一个问题 使用 ajax 我使用以下命令发送了格式正确的 JSON 对象 ajax type POST url SITE URL data php dataType json data ajax 1 success function d
  • Hadoop Streaming:映射器“包装”二进制可执行文件

    我有一个管道 目前在大型大学计算机集群上运行 出于发布目的 我想将其转换为 mapreduce 格式 以便任何使用 amazon webservices AWS 等 hadoop 集群的人都可以运行它 该管道当前由一系列 python 脚本
  • 如何将 python.h 放入 Mac OSX 上的 python virtualenv 中?

    我正在为 python 应用程序编写 C 扩展 并且需要测试特定于 python 的 C 代码 为此 我需要将 Python h 导入到我的 C 文件中 但我一生都无法做到这一点 大多数教程都建议使用 sudo apt get python
  • 比较2个不同pandas数据帧的2列,如果相同则在Python中插入1到另一个

    我有一个带有日期时间 电压数据的熊猫数据框 如下所示 df1 Date Time Chan 0 20130401 9 00 AAT 1 20130401 10 00 AAT 2 20130401 11 00 AAT 3 20130401 1
  • PL/SQL 可选,其中 [重复]

    这个问题在这里已经有答案了 嘿 我在 PL SQL 中有这个查询 Ver todos los atributos de las OL de una OS SELECT attr swspattrdataid attr data id att
  • 阻止执行特定的内联脚本标记

    我正在尝试编写一个脚本捣固猴阻止执行特定的内联脚本标记 页面正文看起来像这样
  • 如何根据一组图像编写电影创作脚本?

    我设法使用 Python 加载了一组图像 我希望我的脚本能够拍摄这一系列图像 以我需要的任何格式 并根据它们创建视频 所有这一切的最大限制是我正在寻找易于安装的东西 理想情况下 使用标准 OS X 安装过程 下载 dmg click 移至应
  • 在spark中,如何快速估计数据框中的元素数量

    在spark中 有没有一种快速的方法来获取数据集中元素数量的近似计数 也就是说 比Dataset count does 也许我们可以根据数据集的分区数量来计算这些信息 可以吗 你可以尝试使用countApprox在 RDD API 上 尽管
  • 如何重写此 Flask 视图函数以遵循 post/redirect/get 模式?

    我有一个小型日志浏览器 它根据用户的输入检索并显示以前记录的记录列表 它不更新任何内容 代码非常简单并且运行良好 这是一个简化版本 app route log methods GET POST def log form LogForm if