我使用mod_wsgi在Apache服务器上运行Django,还有一个由Apache而不是Django直接服务的angularjs应用程序.我想对Django服务器进行POST调用(运行睡觉框架),但是我在使用CSRF令牌时遇到了问题.

有没有办法在不将{% csrf token %}作为模板的一部分的情况下从服务器设置令牌(因为这些页面不经过django)?

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

推荐答案

Django和AngularJS都已经有了CSRF支持,您的部分非常简单.

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

现在,Django将在第一个GET请求上设置一个名为csrftoken的cookie,并期望在以后的POST/PUT/DELETE请求上有一个自定义HTTP头X-CSRFToken.

对于ANGLING,它需要名为XSRF-TOKEN的cookie,并将使用X-XSRF-TOKEN标头执行POST/PUT/DELETE请求,因此您需要做一些调整以使这两个请求相互配合:

$httpProvider.defaults.xsrfCookieName = 'csrftoken';
$httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';

在您的js代码中的某个地方添加以上两行,Mode.config()挡路是一个很好的位置.

就这样.

NOTE:这是angular 1.1.5版本,旧版本可能需要不同的方法.

更新:

由于angular应用程序不由django提供服务,为了设置cookie,angular应用程序需要首先向django发出GET请求.

Django相关问答推荐

如何自动删除 Django 模型中的字段值?

通过 OrderingFilter 过滤平均和

Django中用于外键的嵌套循环

自定义身份验证 django

为什么 Django 在错误的目录中寻找模板?

有谁知道是否可以将您的 Django Heroku 应用程序放到 App Store/Google Play 上?

如何将数据库中的 None 序列化为空对象?

如果一个应用程序有多个具有相同字段的模型,那么保持 DRY 的最佳实践是什么?

在 Django 中处理信用卡付款的最佳 Select 是什么?

如何在 Django 中创建一个独特的 slug

多租户 Django 应用程序:根据请求更改数据库连接?

Django -- User.DoesNotExist 不存在?

在 django 中的查询集上运行 explain的简单方法

django 表单为关键字参数获取了多个值

Django - 来自 QuerySet 的唯一列表

django 模板列表变量中的最后一个元素

django - 使用 get_or_create 自动创建用户时设置用户权限

Django中reverse()和reverse_lazy()的区别

有没有一种简单的方法可以从 CharField 填充 SlugField?

如何更改 django 模板中布尔值的打印方式?