9

私はDjango + AngularJSアプリケーションを開発していますが、角度のある部分はdjangoによって提供されていません。

次のように角度を設定$httpProviderします。

myApp = angular.module('myApp', [])

myApp.config(['$httpProvider',
  function(provider){
    provider.defaults.xsrfCookieName = 'csrftoken';
    provider.defaults.xsrfHeaderName = 'X-CSRFToken';
}

次に、POST を実行する前に、Cookie を設定する GET を実行します。Cookie が設定されていることを Chrome で確認できます。

set-cookie:csrftoken=hg88ZZFEdLPnwDdN1eiNquA8YzTySdQO; expires=Tue, 19-Aug-2014 12:26:35 GMT; Max-Age=31449600; Path=/

(Chrome 開発者ツールの resources/cookies/localhost に表示されます)

ただし、POST を実行すると、X-CSRFTokenヘッダーが設定されていません

これは、Chrome によって記録された POST です。

POST /data/activities/search HTTP/1.1
Host: localhost:14080
Connection: keep-alive
Content-Length: 2
Accept: application/json, text/plain, */*
Origin: http://localhost:14080
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36
Content-Type: application/json;charset=UTF-8
Referer: http://localhost:14080/public/html/main.html?codekitCB=398694184.799418
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Cookie: csrftoken=hg88ZZFEdLPnwDdN1eiNquA8YzTySdQO

ヘッダーが設定されていないのはなぜですか? この機能を有効にするには、他に何をすればよいですか?

(補足: $http() 呼び出しでヘッダーを手動で渡すと、POST リクエストは正常に機能します。したがって、問題は実際には AngularJS によってヘッダーが設定されていないことです)

4

5 に答える 5

8

非常に簡単な答えです。現時点ではリリース候補であるバージョン 1.2.0 からのみ利用できます。

于 2013-08-26T12:46:52.527 に答える
1

Angular は非常に頻繁に変更され、一部の回答は最新バージョンでは機能しません。いずれにせよ、Angular はXSRF-TOKENCookie 名を想定してX-XSRF-TOKENヘッダーを送信するため、デフォルトでこれらを使用するように Django に指示することもできます。

CSRF_COOKIE_NAME = 'XSRF-TOKEN'
CSRF_HEADER_NAME = 'HTTP_X_XSRF_TOKEN'

最初の設定 ( docsを参照) は csrf トークンの Cookie 名であり、2 番目の設定 ( docs を参照 1.9 でのみ導入) はそれぞれのヘッダー名です。

最後に、参考までに、次の設定を忘れないでください。

CSRF_COOKIE_HTTPONLY = False
于 2015-12-22T11:56:13.007 に答える
1
app.config(["$httpProvider", function($httpProvider) {
    var csrfToken = getCookie('csrftoken');
    $httpProvider.defaults.headers.common['X-CSRFToken'] = csrfToken; 
}])

getCookie() https://docs.djangoproject.com/en/dev/ref/contrib/csrf/から取得


または、各メソッドを個別に設定します

 $httpProvider.defaults.headers.post['X-CS....
 $httpProvider.defaults.headers.get['X-CS....
于 2013-08-29T20:25:20.097 に答える