我目前的设置是AngularJS + Django 1.5,我完全抛弃了Django模板引擎的使用(即后端几乎是一个API服务器).
由于我没有使用csrf_token
模板标签,因此Django不会设置并发送csrftoken
cookie作为响应.根据官方文档的指示,ensure_csrf_cookie()
装饰器应该用于强制装饰视图发送csrftoken
cookie.
我已将ensure_csrf_cookie()
装饰器应用于视图,该视图提供了我的Web客户端在引导时调用的第一个GET请求.有了这个,我的Web客户端获得了CSRF令牌,因此允许将不安全的方法(例如POST)调用到服务器.
仅当CSRF令牌保持不变直到浏览会话结束时,上述设置才能正常工作.
问题: Django的CSRF令牌是否在浏览会话期间得到更新?如果'是',这是否意味着我需要将ensure_csrf_cookie()
装饰器应用于我拥有的所有视图?
1)Django的CSRF令牌在浏览会话期间是否得到更新?
看起来CSRF令牌在每个会话中都是唯一的,但根据我的观察,我没有"官方"来源.使用Angular.js我使用以下代码没有问题:
angular.module('app', ...) .config(function($httpProvider) { var cookies = document.cookie.split(';'); var csrftoken = _.find(cookies, function(v) { return v.trim().indexOf('csrftoken=') == 0; }); if(csrftoken) { $httpProvider.defaults.headers.common['X-CSRFToken'] = csrftoken.split('=')[1]; } })
因为我从Django提供HTML,所以当Angular引导时,cookie已经存在.
2)如果'是',这是否意味着我需要将ensure_csrf_cookie()装饰器应用于我拥有的所有视图?
如果CSRF,您可以尝试使用CORS.Otto Yiu维护着django-cors-headers包,已知它可以正常使用REST框架API.
一些(未经测试的)想法适用ensure_csrf_cookie()
:
猴子补丁APIView
创建CSRFCookie mixin并将其添加到您的视图中
适用ensure_csrf_cookie()
于您的基类