一尘不染

Django CSRF令牌+ Angular.js

django

我使用django在使用mod_wsgi的apache服务器上运行,以及由apache而不是django直接提供的angularjs应用程序。我想对django服务器进行POST调用(运行rest_framework),但是我在使用csrf令牌时遇到了问题。

是否可以通过某种方式从服务器设置令牌而不将其{% csrf token %}作为模板的一部分放置(因为这些页面没有经过django)?

  1. 我希望能够通过GET请求以cookie的形式获取csrf令牌。
  2. 我希望能够使用csrf令牌cookie值向django服务器发出POST请求。

阅读 340

收藏
2020-03-26

共1个答案

一尘不染

jango和AngularJS都已经有CSRF支持,你的工作很简单。

首先,你需要在Django中启用CSRF,我相信你已经这样做了,如果没有,请遵循Django doc https://docs.djangoproject.com/en/1.5/ref/contrib/csrf/#ajax。

现在,Django将csrftoken在第一个GET请求上设置一个名为cookie的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';

在你的js代码中的某处添加以上两行,module.config()块是实现此目的的好地方。

而已。

注意:这是针对角度1.1.5,较旧的版本可能需要不同的方法。

更新:
由于django不提供angular应用,因此要设置cookie,angular应用需要先对django进行GET请求。

2020-03-26