Django:CSRF中间件和混合的POST / GET表单

时间:2019-02-11 13:55:16

标签: django django-csrf

我想创建一个带有两个提交按钮的表单:假设SaveBack to edit。 (该表格用于预览/确认当前正在编辑的内容)。

出于明显的原因,Save按钮具有一个值为formaction的{​​{1}}属性,另一个按钮为post。为了使get操作有效,我在表格中加入了常用的post

到目前为止,所有方法都运行良好,唯一的问题是csrfmiddlewaretoken值现在已包含在GET请求中(出于安全原因,似乎不建议这样做)。

当前,我添加了一些自定义javascript,这些脚本通过csrfmiddlewaretoken操作查找所有提交按钮,并添加了一个点击处理程序,该操作将在提交之前从字段中删除get。这似乎是一种比较怪异且反复无常的处理方式。

问题:是否有更好/更标准/更稳定的方式来处理这种情况?

编辑:为什么我要对某些表单操作使用获取请求?

好吧,我想遵循规则(仅对更改数据的请求使用POST请求)(在这种情况下,使用重定向进行响应)。

例如,假设有一个表单,用户可以在其中编辑(“页面A”)某些字段,然后可以按“预览”(GET操作),从而导致显示相同表单的“页面B”。 ,但具有系统生成的预览图像的只读权限。如果用户满意,则可以按“保存”(POST操作)来保存数据,或者按“后退”(GET操作,类似于浏览器的“后退”按钮)继续编辑数据。我不愿意将这种“后退”操作实现为POST,因为这会搞乱与实际的“浏览器后退”按钮等的交互。

在这个简单的示例中,当然可以要求用户使用浏览器的后退按钮而不是表单按钮,或者(可能是?)使用JavaScript模拟浏览器的后退。但是,对于稍微复杂一些的流控制,不能选择简单的“后退”。

1 个答案:

答案 0 :(得分:1)

问题是您从包含View令牌的表单发送了GET请求。我宁愿推荐CSRF请求,也不推荐PUT请求。由于GET请求允许传递主体值,因此CSRF令牌值未显示在URL上。

关于HTTP PUT method