44

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
4

6 に答える 6

45

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と書かれていますが、これはその推奨事項を無視した結果の 1 つです。

issue に関するこの Django チケットもチェックしてください。

request.POST にヒットする [M] ミドルウェアは (通常) バグと見なされます。これは、ビューがカスタム アップロード ハンドラーを設定したり、リクエスト本文のカスタム解析を実行したり、ファイルのアップロードが受け入れられる前に権限チェックを実施したりすることができないことを意味します。

于 2015-02-21T03:59:33.900 に答える