【发布时间】:2019-02-11 13:55:15
【问题描述】:
我想创建一个带有两个提交按钮的表单:假设是Save 和Back to edit。 (该表单用于预览/确认当前正在编辑的内容)。
出于显而易见的原因,Save 按钮具有 formaction 属性,其值为 post,另一个按钮为 get。为了使post 操作起作用,我在表单中包含了通常的csrfmiddlewaretoken。
到目前为止一切正常,唯一的问题是 csrfmiddlewaretoken 值现在包含在 GET 请求中(出于安全原因,这似乎不鼓励)。
目前我添加了一些自定义 javascript 来查找所有带有 get 操作的提交按钮,并添加一个单击处理程序,在提交之前从字段中删除 csrfmiddlewaretoken。这似乎是一种相当奇怪和迂回的做事方式。
问题:有没有更好/更标准/更稳定的方式来处理这种情况?
编辑:为什么我要对某些表单操作使用 get 请求?
好吧,我想遵守规则,将 POST 请求(仅)用于更改数据的请求(在这种情况下以重定向响应)。
例如,考虑一个表单,用户可以在其中编辑(“页面 A”)某些字段,然后可以按“预览”(一个 GET 操作),这会导致显示相同表单的“页面 B” ,但只读,带有系统生成的预览图像。如果用户满意,他们可以按“保存”(一个 POST 操作),这将实际保存数据,或者他们可以按“返回”(一个 GET 操作,类似于浏览器的后退按钮),继续编辑数据。我不乐意将这个“后退”操作实现为 POST,因为这会扰乱与实际浏览器后退按钮等的交互。
在这个简单的示例中,当然可以要求用户使用浏览器返回按钮而不是表单按钮,或者(可能?)使用 javascript 来模拟浏览器返回。但是对于稍微复杂一点的流控制,简单的“返回”不是一种选择。
【问题讨论】:
-
有理由使用 GET 请求吗?
标签: django django-csrf