多语言展示
当前在线:1840今日阅读:167今日分享:16

CSRF token missing or incorrect--django

项目在使用ajax来post数据时,居然一直提示:403错误,原因是“CSRF token missing or incorrect”。最后查了很多资料,终于找到解决办法
工具/原料
1

django

2

javascript

方法/步骤
1

查看浏览器有没有禁用cookie,有的话开启。

2

检查settings.py文件的MIDDLEWARE_CLASSES中是否有'django.middleware.csrf.CsrfViewMiddleware',没有则添加

3

在每个有form表单的页面表单下添加:{% csrf_token %}

4

在每个有form表单的view函数返回是指明返回格式:context_instance=RequestContext(request)其实就是在render_to_response或者Httpresponse等返回时指定context_instance参数的值比如:return render_to_response('index/register.html',_vars,context_instance=RequestContext(request))

5

如果是ajax提交的页面则添加如下csrf.js文件$(function () {    $.ajaxSetup({        headers: { 'X-CSRFToken': getCookie('csrftoken') }    });});function getCookie(name) {     var arr,reg=new RegExp('(^| )'+name+'=([^;]*)(;|$)');     if(arr=document.cookie.match(reg))         return unescape(arr[2]);     else         return null; }

6

总结:其实这一切都是因为django为了防范post跨站攻击而做的措施。只要是post数据,django都会验证是否有csrf的键值,如果没有则视为跨站攻击,以上所有方法其实都是为了让我们在每次post的时候携带这个值。使用context_instance=RequestContext(request)后会自动向网站添加csrf-token的cookie使用{% csrf_token %}会向表单添加hidden项传递这个cookie值而csrf.js能达到{% csrf_token %}同样的目的。

推荐信息