Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django:CSRF中间件和混合POST/GET表单_Django_Django Csrf - Fatal编程技术网

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

Django:CSRF中间件和混合POST/GET表单,django,django-csrf,Django,Django Csrf,我想用两个提交按钮包装一个表单:比如说,保存和返回编辑。该表单用于预览/确认当前正在编辑的内容 出于显而易见的原因,“保存”按钮有一个formaction属性,该属性的值为post,而另一个按钮的值为get。为了使post操作有效,我在表单中包含了通常的csrfmiddlewaretoken 到目前为止,所有的工作都很好,唯一的问题是csrfmiddlewaretoken值现在包含在GET请求中,出于安全原因,这似乎是不鼓励的 目前,我添加了一些自定义javascript,用于查找带有get a

我想用两个提交按钮包装一个表单:比如说,保存和返回编辑。该表单用于预览/确认当前正在编辑的内容

出于显而易见的原因,“保存”按钮有一个formaction属性,该属性的值为post,而另一个按钮的值为get。为了使post操作有效,我在表单中包含了通常的csrfmiddlewaretoken

到目前为止,所有的工作都很好,唯一的问题是csrfmiddlewaretoken值现在包含在GET请求中,出于安全原因,这似乎是不鼓励的

目前,我添加了一些自定义javascript,用于查找带有get action的所有提交按钮,并添加了一个单击处理程序,用于在提交之前从字段中删除csrfmiddlewaretoken。这似乎是一种相当迂回的做事方式

问题:有没有更好/更标准/更稳定的方法来处理这种情况

编辑:为什么要对某些表单操作使用get请求

嗯,我想坚持只对更改数据的请求使用POST请求的规则,在这种情况下,使用重定向进行响应

例如,设想一个表单,其中用户可以编辑a页的某些字段,然后可以按preview a GET action,这将导致B页显示相同的表单,但为只读,并显示由系统生成的预览图像。如果用户满意,他们可以按save a POST action(保存一个实际将保存数据的操作),也可以按back a GET action(返回操作),类似于浏览器的back(返回)按钮,继续编辑数据。我不愿意将此返回操作作为POST来实现,因为这会扰乱与实际浏览器返回按钮等的交互


在这个简单的示例中,您当然可以要求用户使用浏览器后退按钮而不是表单按钮,或者?使用javascript模拟浏览器返回。但是对于稍微复杂一些的流控制,简单的back不是一个选项。

问题是您从包含CSRF令牌的表单发送GET请求。我宁愿推荐PUT请求而不是GET请求。由于PUT请求允许传递正文值,因此URL上不公开CSRF令牌值


关于

是否有使用GET请求的理由?谢谢您的建议。从语义上看,PUT确实是一个完美的解决方案。然而,我有点担心PUT in django是否有稳定的支持?文档通常只提到POST和GET。首先,我会在request.PUT或request.post中找到PUT数据吗?各种中间件是否可以与PUT一起工作?webtest等吗?。至少在我希望发布或获取的地方,我必须更改一些自己的代码……这将对您有所帮助@雅各布