Python 使用Django Angular对视图进行AJAX调用
我试图使用Django Angular对Django中的视图进行AJAX调用。我遵循这个指南 然而,当我发表帖子时,我得到的信息是:CSRF验证失败。请求已中止。似乎没有调用Python 使用Django Angular对视图进行AJAX调用,python,django,angularjs,Python,Django,Angularjs,我试图使用Django Angular对Django中的视图进行AJAX调用。我遵循这个指南 然而,当我发表帖子时,我得到的信息是:CSRF验证失败。请求已中止。似乎没有调用过程中描述的操作,因为我不需要令牌 有人能发现这个问题吗,下面是我到目前为止尝试过的 以下是相关的js控制器脚本: var in_data = {action: 'process_something', somevar: $scope.somevar}; var post_call = CbgenRestangu
过程中描述的操作
,因为我不需要令牌
有人能发现这个问题吗,下面是我到目前为止尝试过的
以下是相关的js控制器脚本:
var in_data = {action: 'process_something', somevar: $scope.somevar};
var post_call = CbgenRestangularDjango.all('pin-verification/').post(in_data)
<form ng-controller="PinValidationFormCtrl" name="CompanyValidPinForm" class="bs-callout">
<div class="col-xs-2">
<input class="form-control" name="somevar" ng-model="somevar" type="text">
</div>
<div class="col-xs-2">
<button type="button" class="btn btn-default" ng-click="submitPin()">Verify Pin</button>
</div>
</form>
和表单:
var in_data = {action: 'process_something', somevar: $scope.somevar};
var post_call = CbgenRestangularDjango.all('pin-verification/').post(in_data)
<form ng-controller="PinValidationFormCtrl" name="CompanyValidPinForm" class="bs-callout">
<div class="col-xs-2">
<input class="form-control" name="somevar" ng-model="somevar" type="text">
</div>
<div class="col-xs-2">
<button type="button" class="btn btn-default" ng-click="submitPin()">Verify Pin</button>
</div>
</form>
您很可能在angular的应用程序模块配置中缺少标题
尝试设置以下选项
.config(function($httpProvider) {
$httpProvider.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
});
Django应用程序不需要此标头,但如果缺少此标头,则对:request.is\u ajax()
的所有调用都将返回False,即使对于完全有效的ajax请求也是如此
可在此处找到:
此外,angular版本>=1.1.x时也发生了api更改(自该版本以来,此标头默认值已被删除)。也许Django并没有在每个部分都跟上他们的文档
可能您只需要清除浏览器缓存,因为您可能有一个过时的cookie发送了一个无效的令牌,导致请求映射失败。在发送HTTP POST请求时,您必须传递csrf令牌
在表单中包括{%csrf\u token%}
或添加自定义头X-CSRFToken
。这应该是可行的。方法接受一个配置参数来传递X\u CSRFTOKEN
头:
var config = { headers : { 'X_CSRFTOKEN' : $cookies.csrf_token }};
var in_data = {action: 'process_something', somevar: $scope.somevar};
var post_call =
CbgenRestangularDjango.all('pin-verification/').post(in_data, config);
在视图的模板中,表单必须包含令牌,如下所示:
<form ...>
{% csrf_token %}
...
</form>
{%csrf_令牌%}
...
注意$cookies
取决于ngCookies
(请参阅)您也可以尝试/使用@csrf\u-employ
装饰器
-->
下面是Django文档,介绍如何将其应用于基于类的视图=)
@Stewie我想问题很清楚,你可以看到我已经尝试过了。我不确定你为什么发表评论,请详细说明。谢谢。你按规定安装了angular应用程序吗?是的@mariodev,我有:)。我让Django Angular处理正常的GET请求,但出于某种原因,它没有在正在发布的帖子视图中调用process_something函数,我认为这就是为什么我将CSRF消息作为[@]未运行允许的\u操作。当您使用@csrf\u emption
处理\u某物时,POST请求是否有效?(如果用csrf\u-emption
装饰基于类的视图的方法不起作用,请尝试)尝试post请求的(firebug)屏幕截图也会很有帮助。您尝试过这个吗?我删除了这个答案好几天了,但我仍然很好奇这是否是问题所在,所以我重新激活了它。