23

この Django ビューに対して angular.js を使用して POST リクエストを作成しようとしています。

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メソッドを呼び出すと、正常に機能します。URL は に変換され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!'});  
    });
}

update/POST メソッドの実行で問題に直面しています。

item.$update();

URL は に変換されますが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 (Forbidden) ステータス コードが表示されます。これは、おそらくPOST 要求でCSRFトークンを渡していないことが原因です。したがって、私の質問は、角度によって作成された POST リクエストに CSRF トークンを渡す方法に要約されますか?

ヘッダーを介してcsrfトークンを渡すこのアプローチについては知っていますが、ここで提案されているように、投稿リクエストの本文にトークンを追加する可能性を探しています。投稿リクエストの本文にデータを追加する角度で可能ですか?

追加の読み物として、リソースに関するこれらの議論、末尾のスラッシュの削除、および現在のリソースの制限: disk1およびdisc2を参照できます。ディスカッションの 1 つで、作成者の 1 人が現在リソースを使用せず、代わりにこのアプローチを使用することを推奨しました。

4

5 に答える 5

7

次のような電話をかけることはできませんか。

$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 }} 

文書化されていない問題です

于 2012-10-10T17:50:12.467 に答える
0

私はこれを使用します:

Django ビューで:

@csrf_protect
def index(request):
    #Set cstf-token cookie for rendered template
    return render_to_response('index.html', RequestContext(request))

App.js の場合:

(function(A) {
    "use strict";
    A.module('DesktopApplication', 'ngCookies' ]).config(function($interpolateProvider, $resourceProvider) {
        //I use {$ and $} as Angular directives
        $interpolateProvider.startSymbol('{$');
        $interpolateProvider.endSymbol('$}');
        //Without this Django not processed urls without trailing slash
        $resourceProvider.defaults.stripTrailingSlashes = false; 
    }).run(function($http, $cookies) {
        //Set csrf-kookie for every request
        $http.defaults.headers.post['X-CSRFToken'] = $cookies.csrftoken;
        $http.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
    });
}(this.angular));

正しいリクエストを送信するには、オブジェクトを param-form に変換する必要があります。

$http.post('/items/add/', $.param({name: 'Foo'}));//Here $ is jQuery
于 2014-12-11T17:53:26.453 に答える
0
var app = angular.module('angularFoo', ....

app.config(["$httpProvider", function(provider) {
  provider.defaults.headers.common['X-CSRFToken'] = '<<csrftoken value from template or cookie>>';
}])
于 2013-08-01T21:46:07.803 に答える