1. ホーム
  2. django

[解決済み] 例外です。リクエストのデータストリームから読み込んだ後、ボディにアクセスすることはできません。

2022-02-10 07:34:48

質問

Django 1.5 からは、生の投稿データは request.body でアクセスできるようになりました。

私のアプリケーションでは、フォーム経由でデータが送信されることもあれば、生データ(例えばjson)が送信されることもあります。 このような失敗しない関数を書く方法はないでしょうか?

def get_post_var(request, name):
    result = request.POST.get(name)
    if result:
        return result

    post_body = dict(urlparse.parse_qsl(request.body))
    result = post_body.get(name)
    if result:
        return result

    return None

解決方法は?

エラー You cannot access body after reading from request's data stream は、(1) リクエストメソッドが POST で、(2) そのリクエストの POST 辞書がミドルウェアでアクセスされた場合、いずれかのリクエストでトリガーされます。 process_request または process_view と(3)ビュー機能内で request.body がアクセスされる。バグの本当の原因は(2)であるにもかかわらず、エラーが発生するのは(3)である。

このエラーを解決するためには、ミドルウェアのどこで request.POST にアクセスしないように修正します。 request.POST を追加しました。

Djangoのドキュメントには、以下のように書かれています。 ミドルウェアは request.POST これは、その勧告を無視した結果の一つです。

こちらもご覧ください この問題についてのDjangoのチケット このノートも含まれています。

<ブロッククオート

[request.POSTをヒットさせるミドルウェアは、(通常は)そのように考えるべきでしょう。 バグです。これは、ビューがカスタムアップロードを設定できないことを意味します。 ハンドラ、リクエストボディのカスタムパースの実行、あるいは は、ファイルアップロードを受け入れる前にパーミッションチェックを行います。