使用CSRF_COOKIE_HTTPONLY = True将角形式提交到django后端

时间:2015-06-04 23:44:13

标签: angularjs django csrf django-csrf

我有一个有角度的表格,我想通过邮寄请求提交给我的django后端。常规的智慧是在你的愤怒应用上使用以下技巧:

angularApp.config(['$httpProvider', function ($httpProvider) {
    $httpProvider.defaults.xsrfCookieName = 'csrftoken';
    $httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';
}]);

但是,这需要您的cookie可以访问javascript。当您拥有django设置CSRF_COOKIE_HTTPONLY = True时,如何从angular到django发布帖子请求?

请注意,这个问题也可以用于如何使用基于django会话的csrf令牌(例如使用https://github.com/mozilla/django-session-csrf)的角度,因为这具有相同的角度无法访问crsf令牌的问题饼干。

1 个答案:

答案 0 :(得分:2)

免责声明:此答案适用于Django至1.9或者如果您在每个页面上使用单独的角度应用程序。这是因为Django 1.10更改了CSRF中间件以在每次请求后更改令牌。对于在Django 1.10+上运行的单页角应用程序,请参阅Pass Django CSRF token to Angular with CSRF_COOKIE_HTTPONLY

<强>答案:

在模板的某处,将csrf标记附加到您的窗口:

<script type='text/javascript'>
    window.csrfmiddlewaretoken = "{{ csrf_token }}";
</script>

然后,您可以直接在帖子请求的标题上设置csrf标记而无需cookie:

angularApp.config(['$httpProvider', function ($httpProvider) {
    $httpProvider.defaults.headers.post["X-CSRFToken"] = window.csrfmiddlewaretoken;
}]);