我有使用mod_wsgi在apache服务器上运行的django,以及由apache(而不是django)直接提供服务的angularjs应用。我想对django服务器进行POST调用(运行rest_framework),但csrf令牌存在问题。
是否可以通过某种方式从服务器设置令牌而不将其{% csrf token %}作为模板的一部分放置(因为这些页面没有经过django)?
{% csrf token %}
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标头。
csrftoken
X-CSRFToken
对于Angular,它希望cookie命名为,XSRF-TOKEN并且将执行带有X-XSRF-TOKEN标头的POST / PUT / DELETE请求,因此您需要做一些调整以使两者相互兼容:
XSRF-TOKEN
X-XSRF-TOKEN
$httpProvider.defaults.xsrfCookieName = 'csrftoken'; $httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';
在您的js代码中的某处添加以上两行,module.config()块是实现此目的的好地方。
而已。
注意: 这是针对角度1.1.5,较旧的版本可能需要不同的方法。
由于django不提供angular应用,因此为了设置cookie,angular app需要先对django进行GET请求。