我正在尝试使用angular.js创建一个POST请求到这个Django视图。
class PostJSON4SlickGrid(View): """ REST POST Interface for SlickGrid to update workpackages """ def post(self, request, root_id, wp_id, **kwargs): print "in PostJSON4SlickGrid" print request.POST return HttpResponse(status=200)
因此,我创建了此资源。
myModule.factory('gridData', function($resource) { //define resource class var root = {{ root.pk }}; return $resource('{% url getJSON4SlickGrid root.pk %}:wpID/', {wpID:'@id'},{ get: {method:'GET', params:{}, isArray:true}, update:{method:'POST'} }); });
在控制器中调用 get 方法可以正常工作。网址已翻译为http://127.0.0.1:8000/pm/rest/tree/1/。
http://127.0.0.1:8000/pm/rest/tree/1/
function gridController($scope, gridData){ gridData.get(function(result) { console.log(result); $scope.treeData = result; //broadcast that asynchronous xhr call finished $scope.$broadcast('mySignal', {fake: 'Hello!'}); }); }
我在执行更新/ POST方法时遇到问题。
item.$update();
该网址已转换为http://127.0.0.1:8000/pm/rest/tree/1/345,其中缺少一个斜杠。如果在URL定义中不使用斜杠,可以很容易地避免这种情况。
http://127.0.0.1:8000/pm/rest/tree/1/345
url(r'^rest/tree/(?P<root_id>\d+)/(?P<wp_id>\d+)$', PostJSON4SlickGrid.as_view(), name='postJSON4SlickGrid'),
代替
url(r'^rest/tree/(?P<root_id>\d+)/(?P<wp_id>\d+)/$', PostJSON4SlickGrid.as_view(), name='postJSON4SlickGrid'),
使用不带斜杠的变通方法,我现在得到403(禁止)状态代码,这可能是由于我未在POST请求中传递CSRF令牌。因此,我的问题归结为如何将CSRF令牌传递到由angular创建的POST请求中?
我知道这种方法来传递CSRF令牌通过头,但我找了可能性 令牌添加到POST请求的身体,如建议在这里。是否有可能向发布请求正文中添加数据?
作为其他阅读材料,您可以查看关于资源,删除的尾部斜杠和资源当前具有的限制的这些讨论:disc1和disc2。在其中一个讨论中,一位作者建议当前不使用资源,而应使用这种方法。
您不能像这样拨打电话:
$http({ method: 'POST', url: url, data: xsrf, headers: {'Content-Type': 'application/x-www-form-urlencoded'} })
该data可不管你要传递,然后只是追加&{{csrf_token}}了这一点。
data
&{{csrf_token}}
在您的资源中params:{},尝试csrfmiddlewaretoken:{{csrf_token}}在params
params:{}
csrfmiddlewaretoken:{{csrf_token}}
params
编辑:
您可以将数据传递给请求主体
item.$update({csrfmiddlewaretoken:{{csrf_token}}})
和标题为
var csrf = '{{ csrf_token }}'; update:{method:'POST', headers: {'X-CSRFToken' : csrf }}
这是一个未记录的问题