Pre*_*eom 64 javascript python django angularjs
我使用mod_wsgi在apache服务器上运行django,以及直接由apache服务的angularjs应用程序,而不是django.我想对django服务器进行POST调用(运行rest_framework),但我遇到了csrf令牌的问题.
有没有办法从服务器设置令牌而不{% csrf token %}作为模板的一部分(因为这些页面不通过django)?
Ye *_*Liu 111
Django和AngularJS都已经拥有CSRF支持,你的部分非常简单.
首先,您需要在Django中启用CSRF,我相信您已经这样做了,如果没有,请关注Django doc https://docs.djangoproject.com/en/1.5/ref/contrib/csrf/#ajax.
现在,Django将csrftoken在第一个GET请求中设置一个cookie ,并期望X-CSRFToken在以后的POST/PUT/DELETE请求中使用自定义HTTP头.
对于Angular,它期望cookie命名XSRF-TOKEN并将使用X-XSRF-TOKEN标题执行POST/PUT/DELETE请求,因此您需要进行一些调整以使两者相互依赖:
$httpProvider.defaults.xsrfCookieName = 'csrftoken';
$httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';
Run Code Online (Sandbox Code Playgroud)
在你的js代码中的某处添加以上两行,module.config()块是一个很好的地方.
而已.
注意:这是针对角度1.1.5,旧版本可能需要不同的方法.
由于角度应用程序不是由django提供的,为了让cookie设置,角度应用程序需要首先对django执行GET请求.
Nik*_*luk 60
var foo = angular.module('foo', ['bar']);
foo.config(['$httpProvider', function($httpProvider) {
$httpProvider.defaults.xsrfCookieName = 'csrftoken';
$httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';
}]);
Run Code Online (Sandbox Code Playgroud)
所有使用$ http的模块服务和控制器都将使用csrf令牌发送请求.
Pre*_*eom 11
在搜索之后,对我有用的是这篇文章,其中包含以下代码:
angular.module( '[your module name]',
... [some dependencies] ...
'ngCookies',
... [other dependencies] ...
)
.run( function run( $http, $cookies ){
// For CSRF token compatibility with Django
$http.defaults.headers.post['X-CSRFToken'] = $cookies.get('csrftoken');
})
Run Code Online (Sandbox Code Playgroud)
这当然是在通过django服务器的GET请求获取cookie之后.
我也在这里查看了其他一些答案,包括Ye Liun,但在官方文档中找不到任何指定更改$ httpProvider上xsrf的默认选项的内容,除了这个拉取请求对我不起作用我写这篇文章的时间.
| 归档时间: |
|
| 查看次数: |
32171 次 |
| 最近记录: |