1

Django ビューに次のコードがあります。

if request.is_ajax():
    if request.method == 'POST':
        data = json.loads(request.raw_post_data)

そして、CURL 経由でこのリクエストを送信します。

curl -v -i -H "Content-Type:application/json" -H "X_REQUESTED_WITH:XMLHttpRequest" -X POST -d '{"tweet_id":"189881044923719680", "question_id":"1", "choice_one":"T", "choice_two":"F", "choice_three":"F", "extra_passback":"common cold"}' http://ec[...].compute-1.amazonaws.com/question/answer/

これは、開発中の Django サーバーにアクセスしたときに機能します。本番環境では、nginx と gunicorn を実行しています。そして、curl ステートメントは機能しません。

request.is_ajax() は False を返します (is_ajax は x_requested_with ヘッダーを探します)。

これはおそらくNGINXの設定と関係があるに違いないと思います。確信はないけど。何を変更する必要がありますか?

4

1 に答える 1

2

X_REQUESTED_WITH:XMLHttpRequestアンダースコアをダッシュ​​で変更してみてください: X-REQUESTED-WITH:XMLHttpRequest.

X_REQUESTED_WITHプロキシがリクエストからフィールドを削除したため、nginxで同じ問題が発生しました。デフォルトでは、nginx はアンダースコア付きのヘッダーを無効としてマークし、無効なヘッダーを無視します。

nginx ディレクティブを使用して、ヘッダーでアンダースコアを許可するか、underscores_in_headers on;無効なヘッダーを無視しないようにすることができますignore_invalid_headers off;

私の具体的なケースでは、python requests をクライアントとして、django をサーバーとして、nginx をプロキシとして使用し、名前を に変更X_REQUESTED_WITHした問題を解決しましたX-REQUESTED-WITH。(Django は'HTTP_'、ヘッダーを で使用できるようにする前に、x-header 名の先頭に自動的に追加しますrequest.META.)

import requests
headers = {'X-REQUESTED-WITH':'XMLHttpRequest'}
r = requests.post(url, data=payload, headers=headers)
于 2012-10-26T06:00:03.797 に答える