2017-06-15 12 views
3

Djangoにいくつかのリクエストを送信すると、時間の前に接続が切断されるという問題があります。ここでDjangoはいくつかのリクエストで接続をリセットします

はここでGithubの

simple projectであることは無いボディとシンプルなPOST要求にどのように動作するかです: enter image description here

しかし、私はいくつかのバイナリデータを送信するとき、〜サイズは15メガバイト、郵便配達員は、接続エラーが表示されます。 enter image description here

しかし、細かい

を作品 カール

私はこれがPostmanのいくつかのバグだと思っていましたが、モバイルデバイスではそれもうまくいきません。

リクエストヘッダーを比較しようとしました。私はミドルウェアを投げようとしました。私はDjnagoコードをデバッグしようとしました。しかし、私は解決策を見つけることができます。これで私を助けることができますか?

FILE_UPLOAD_MAX_MEMORY_SIZE = 1000 * 1000 * 1000 
DATA_UPLOAD_MAX_MEMORY_SIZE = 1000 * 1000 * 1000 

が問題

UPDATE 2

私はラインを追加print(len(request.body))インデックス方法に修正されませんsettings.pyファイルに

UPDATE 1

設定:

@csrf_exempt 
def index(request): 
    print(len(request.body)) 

    return HttpResponse("Hello") 

これで機能します。しかし、私はなぜ完全な要求に身体を参照する必要がありますか? 私の実際のプロジェクトでは、認証トークンをチェックし、それが間違っていると、身体から何かを読まなかった。

+0

これはサイズだけでいくつかのメガビットのあるPOST要求のために発生しますか? – dentemm

+0

私は70KBのファイルを試しましたが、それは問題ありませんでした。私はDATA_UPLOAD_MAX_MEMORY_SIZEを変更しようとしましたが、それは役に立たなかった – atomAltera

答えて

1

うわー、私はあなたのレポでこれを再現できます。

私はWiresharkで一見して、ペイロード全体が送信される前にDjangoのdevserverが実際に応答しているように見えます。私はHTTPの仕様が大丈夫かどうかについてはっきりしていませんが、libcurlのようなものは大丈夫ですが、いくつかのクライアントライブラリ(Postmanとモバイルデバイスで使用される)がこのエラーと判断するのは明らかです。

print(len(request.body))を追加すると、応答を出力する前に長さを把握するために、Django(およびその下位のスタック)が本文全体を使用するよう強制されます。

この現象は、uwsgiでアプリケーションを実行しているときに発生します。これは価値があります。

TCPストリームはWiresharkの中で次のようになります。 enter image description here

+0

ありがとう、ありがとうございました、その動作を防ぐためにいくつかのDjangoの設定がありますか? .body私はいくつかのケースでそれをneetしない場合。 – atomAltera

+1

あなたはすべての要求で強制的に 'request.POST'または' request.body'にアクセスするミドルウェアを書くことができます。正直言って、あなたが私に尋ねる場合は、それらを期待していないエンドポイントにペイロード: – AKX

0

私はHerokuに関する私のプロジェクトの1つに関して数週間前に全く同じ問題を抱えていました。 Herokuのログにはあまり有用でない「Server Request Interrupted」エラーが表示されました。デバッグの日とdjangoソースコードを調べた後、私はそれがdjango's Upload Handlersに関連していることが分かった。

デフォルトでは2.5MbのFILE_UPLOAD_MAX_MEMORY_SIZEという設定があります。この設定より小さいアップロードはMemoryFileUploadHandler(メモリ内)で処理されます。そうでない場合は、TemporaryFileUploadHandlerがファイル処理を行います。私は理由を知りませんでしたが、HerokuではTemporaryFileUploadHandlerが常にアプリケーションをクラッシュさせました。私はクライアントがアップロードする最大ファイルサイズに設定を増やすことで回避策を作成しました。

+0

残念ながらFILE_UPLOAD_MAX_MEMORY_SIZEイベントを1000000000まで設定しても問題は解決しません。 – atomAltera

+0

更新を参照してください1 – atomAltera

+0

あまりにも悪い:-(私は思っていませんが私は恐れています... – dentemm

関連する問題