Django:CSRF 中间件和混合 POST/GET 形式
Django: CSRF middleware and mixed POST/GET forms
我想创建一个带有两个提交按钮的表单:Save
,比方说,Back to edit
。 (该表格用于预览/确认当前正在编辑的内容)。
由于显而易见的原因,Save
按钮有一个 formaction
属性,值为 post
和另一个按钮 get
。为了使 post
操作起作用,我在表单中包含了通常的 csrfmiddlewaretoken
。
到目前为止一切正常,唯一的问题是 csrfmiddlewaretoken
值现在包含在 GET 请求中(出于安全原因似乎不鼓励这样做)。
目前,我添加了一些自定义 javascript,用于查找所有具有 get
操作的提交按钮,并添加了一个单击处理程序,用于在提交前从字段中删除 csrfmiddlewaretoken
。这似乎是一种相当奇怪和迂回的做事方式。
问题:有没有更好/更标准/更稳定的方式来处理这种情况?
编辑: 为什么我要对某些表单操作使用获取请求?
好吧,我想坚持使用 POST 请求的规则(仅)用于更改数据的请求(在这种情况下通过重定向响应)。
举个例子,想一想用户可以编辑 ("page A") 某些字段的表单,然后可以按 "preview"(GET 操作),这会导致 "page B"其中显示相同的表单,但只读,带有系统生成的预览图像。如果用户满意,他们可以按 "save"(一个 POST 操作)这将实际保存数据,或者他们可以按 "back"(一个 GET 操作,类似于浏览器的后退按钮), 继续编辑数据。我不乐意将此 "Back" 操作实现为 POST,因为这会扰乱与实际浏览器后退按钮等的交互。
在这个简单的示例中,当然可以要求用户使用浏览器后退按钮而不是表单按钮,或者(可能?)使用 javascript 来模拟浏览器后退。但是对于稍微复杂的流量控制,简单的 "back" 不是一个选项。
问题是您从包含 CSRF
令牌的表单发送 GET
请求。我宁愿推荐 PUT
请求而不是 GET
请求。 CSRF 令牌值未在 URL 上公开,因为 PUT
请求允许传递正文值。
我想创建一个带有两个提交按钮的表单:Save
,比方说,Back to edit
。 (该表格用于预览/确认当前正在编辑的内容)。
由于显而易见的原因,Save
按钮有一个 formaction
属性,值为 post
和另一个按钮 get
。为了使 post
操作起作用,我在表单中包含了通常的 csrfmiddlewaretoken
。
到目前为止一切正常,唯一的问题是 csrfmiddlewaretoken
值现在包含在 GET 请求中(出于安全原因似乎不鼓励这样做)。
目前,我添加了一些自定义 javascript,用于查找所有具有 get
操作的提交按钮,并添加了一个单击处理程序,用于在提交前从字段中删除 csrfmiddlewaretoken
。这似乎是一种相当奇怪和迂回的做事方式。
问题:有没有更好/更标准/更稳定的方式来处理这种情况?
编辑: 为什么我要对某些表单操作使用获取请求?
好吧,我想坚持使用 POST 请求的规则(仅)用于更改数据的请求(在这种情况下通过重定向响应)。
举个例子,想一想用户可以编辑 ("page A") 某些字段的表单,然后可以按 "preview"(GET 操作),这会导致 "page B"其中显示相同的表单,但只读,带有系统生成的预览图像。如果用户满意,他们可以按 "save"(一个 POST 操作)这将实际保存数据,或者他们可以按 "back"(一个 GET 操作,类似于浏览器的后退按钮), 继续编辑数据。我不乐意将此 "Back" 操作实现为 POST,因为这会扰乱与实际浏览器后退按钮等的交互。
在这个简单的示例中,当然可以要求用户使用浏览器后退按钮而不是表单按钮,或者(可能?)使用 javascript 来模拟浏览器后退。但是对于稍微复杂的流量控制,简单的 "back" 不是一个选项。
问题是您从包含 CSRF
令牌的表单发送 GET
请求。我宁愿推荐 PUT
请求而不是 GET
请求。 CSRF 令牌值未在 URL 上公开,因为 PUT
请求允许传递正文值。