一尘不染

如何使用Django和AngularJS创建POST请求(包括CSRF令牌)

angularjs

我正在尝试使用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/

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定义中不使用斜杠,可以很容易地避免这种情况。

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。在其中一个讨论中,一位作者建议当前不使用资源,而应使用这种方法。


阅读 182

收藏
2020-07-04

共1个答案

一尘不染

您不能像这样拨打电话:

$http({
    method: 'POST',
    url: url,
    data: xsrf,
    headers: {'Content-Type': 'application/x-www-form-urlencoded'}
})

data可不管你要传递,然后只是追加&{{csrf_token}}了这一点。

在您的资源中params:{},尝试csrfmiddlewaretoken:{{csrf_token}}params

编辑:

您可以将数据传递给请求主体

item.$update({csrfmiddlewaretoken:{{csrf_token}}})

和标题为

var csrf = '{{ csrf_token }}'; 
update:{method:'POST', headers: {'X-CSRFToken' : csrf }}

这是一个未记录的问题

2020-07-04