django post出现403的解决办法 据说,从django1.x开始,加入了CSRF保护。
什么是CSRF
CSRF,Cross Site Request Forgery,跨站伪造请求。举例来讲,某个恶意网站上有一个指向你网站的链接,如果某个用户已经登陆上你的网站了,那么当这个用户已经登录上你的网站上了,那么当这个用户点击这个恶意网站上的链接时,就会向你的网站发来一个请求,你的网站会以为这个请求时用户自己发来的,其实呢,这个请求是那个恶意网站伪造的。
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攻击,返回403Forbidden
4. 在所有ajax POST请求里,添加一个X-CSRFTOKEN header,其值为cookie里的csrftoken的值
Django里如何使用CSRF防护
1. 首先,最基本的原则是:GET请求不要用有副作用,也就是说任何处理GET请求的代码对资源的访问都一点要是“只读的”
2. 要启用django.middleware.csrf.CsrfViewMiddleware这个中间件
3. 再次,在所有的POST表单元素时,需要加上一个{%csrf_token%}这个tag
4. 在渲染模块时,使用RequestContext。RequestContext会处理csrf_token这个tag,从而自动为表单添加一个名为csrfmiddlewaretoken的input
django关闭csrf保护机制
1. 在setting中注释'django.middleware.csrf.CsrfViewMiddleware'这个中间件
2. 在view.py中引入模块
from django.views.decorators.csrf imoport csrf_exempt
在需要关闭csrf保护机制的方法前边用@csrf_exempt装饰器。