Py学习  »  问与答

django+easyui datagrid post请求出现403问题

旧城以西 • 8 年前 • 4834 次点击  

请教一个问题 在使用easyui做为前端视图的时候后端是django,easyui-datagrid里面提交一个post请求,会出现403的错误,原因是django自带的csrf验证,我怎么样才能在easyui-datagrid里面把csrf一起提交有没有人遇到这个情况?我知道有一个解决方法是直接让django跳过csrf验证,但是这样子不是我所需要的,我想要在我的代码中使用django的csrf验证,请大家指教

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/1325
 
4834 次点击  
文章 [ 1 ]  |  最新文章 8 年前
shen_gan
Reply   •   1 楼
shen_gan    8 年前

使用 django 的模板时,在每一个 POST form 表单中都需要添加{% csrf_token %},它的值是这样子的:

<input type="hidden" name="csrfmiddlewaretoken" value="plysVEeY1PoO8xOrmLKTAR109pHutKCL">

看下面的引用文章片段:

Django 提供的 CSRF 防护机制

django 第一次响应来自某个客户端的请求时,会在服务器端随机生成一个 token,把这个 token 放在 cookie 里。然后每次 POST 请求都会带上这个 token,

这样就能避免被 CSRF 攻击。

  1. 在返回的 HTTP 响应的 cookie 里,django 会为你添加一个 csrftoken 字段,其值为一个自动生成的 token
  2. 在所有的 POST 表单时,必须包含一个 csrfmiddlewaretoken 字段 (只需要在模板里加一个 tag, django 就会自动帮你生成,见下面)
  3. 在处理 POST 请求之前,django 会验证这个请求的 cookie 里的 csrftoken 字段的值和提交的表单里的 csrfmiddlewaretoken 字段的值是否一样。如果一样,则表明这是一个合法的请求,否则,这个请求可能是来自于别人的 csrf 攻击,返回 403 Forbidden.
  4. 在所有 ajax POST 请求里,添加一个 X-CSRFTOKEN header,其值为 cookie 里的 csrftoken 的值

看第2点,对照着你的问题:“我怎么样才能在easyui-datagrid里面把csrf一起提交?”,
我的回答是: 你可以在 POST 的时候添加一个 csrfmiddlewaretoken 参数,值为 plysVEeY1PoO8xOrmLKTAR109pHutKCL

至于这个值的获取(对于每个django都不一样):

  1. 可以随意看一个 django 模板中的表单,查看对应页面的源代码,即可看到。
  2. 根据引用的第1点,可查看 cookie 中的 csrftoken 字段值。