django
javascript
查看浏览器有没有禁用cookie,有的话开启。
检查settings.py文件的MIDDLEWARE_CLASSES中是否有'django.middleware.csrf.CsrfViewMiddleware',没有则添加
在每个有form表单的页面表单下添加:{% csrf_token %}
在每个有form表单的view函数返回是指明返回格式:context_instance=RequestContext(request)其实就是在render_to_response或者Httpresponse等返回时指定context_instance参数的值比如:return render_to_response('index/register.html',_vars,context_instance=RequestContext(request))
如果是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; }
总结:其实这一切都是因为django为了防范post跨站攻击而做的措施。只要是post数据,django都会验证是否有csrf的键值,如果没有则视为跨站攻击,以上所有方法其实都是为了让我们在每次post的时候携带这个值。使用context_instance=RequestContext(request)后会自动向网站添加csrf-token的cookie使用{% csrf_token %}会向表单添加hidden项传递这个cookie值而csrf.js能达到{% csrf_token %}同样的目的。