这个问题是由跨站点伪造请求(CRSF)形成的,要完全的弄懂这个问题就要理解什么是CRSF,以及Django提供的CSRF防御机制是怎么工做的。ajax
CSRF, Cross Site Request Forgery, 跨站点伪造请求。举例来说,某个恶意的网站上有一个指向你的网站的连接,若是某个用户已经登陆到你的网站上了,那么当这个用户点击这个恶意网站上的那个连接时,就会向你的网站发来一个请求,你的网站会觉得这个请求是用户本身发来的,其实呢,这个请求是那个恶意网站伪造的。django
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 的值cookie
1.在全部的 POST 表单元素时,须要加上一个 {% csrf_token %} 标签
2.要启用 django.middleware.csrf.CsrfViewMiddleware 这个中间件
3.每次发 ajax POST 请求,都须要加一个 X_CSRFTOKEN 的 header网站