タイトルが尋ねるように、なぜDjangoの連中はquerydictを使用してrequest.POSTオブジェクトを実装することにしたのですか(これにより、もちろん、全体が不変になりますか?)
私はあなたが投稿データのコピーを作成することによってそれを変形できることを知っています
post = request.POST.copy()
しかし、なぜこれを行うのですか?とにかく物事を変更可能にするだけのほうが簡単でしょうか?それとも問題を引き起こす可能性のある他の理由でも使用されていますか?
タイトルが尋ねるように、なぜDjangoの連中はquerydictを使用してrequest.POSTオブジェクトを実装することにしたのですか(これにより、もちろん、全体が不変になりますか?)
私はあなたが投稿データのコピーを作成することによってそれを変形できることを知っています
post = request.POST.copy()
しかし、なぜこれを行うのですか?とにかく物事を変更可能にするだけのほうが簡単でしょうか?それとも問題を引き起こす可能性のある他の理由でも使用されていますか?
回答:
ちょっと謎ですよね。いくつかの表面的にもっともらしい理論は調査で間違っていることが判明しました:
だからPOSTオブジェクトは、突然変異のメソッドを実装する必要はありませんか?いいえ:POSTオブジェクトはクラスに属していますdjango.http.QueryDictを含む変異メソッドのフルセットを実装して、__setitem__、__delitem__、popとclear。ミューテーションメソッドの1つを呼び出すときにフラグをチェックすることにより、不変性を実装します。また、copyメソッドを呼び出すQueryDictと、変更可能なフラグがオンになっている別のインスタンスが取得されます。
パフォーマンス向上のために?いいえ:QueryDict変更可能なフラグがオフになっている場合、クラスはパフォーマンス上の利点を得ません。
ように、POSTオブジェクトは、辞書のキーとして使用することができますか?いいえ:QueryDictオブジェクトはハッシュ可能ではありません。
だからPOSTデータは、(全体の応答を読み取るためにコミットせず)レイジーに構築することができ、ここで記載の?コードにこれの証拠はありません。私が知る限り、応答全体も常に読み取られます。直接、または応答経由MultiPartParserでれmultipartます。
プログラミングエラーからあなたを守るために?私はこれが主張されているのを見てきましたが、これらのエラーが何であるか、そして不変性がそれらからあなたをどのように保護するかについての良い説明を見たことがありません。
いずれにせよ、POSTあります常に不変ません。応答がのmultipart場合、POSTは変更可能です。これはあなたが考えるかもしれないほとんどの理論にキボッシュを置くようです。(この動作が見落としでない限り)。
要約すると、Djangoでは、オブジェクトがリクエスト以外に対して不変であるという明確な根拠はありません。POSTmultipart
リクエストがDjangoのの結果であった場合にform提出、POSTがあることのため合理的であるimmutableデータの整合性を確認するために間にフォームの提出とフォームのバリデーションを。ただし、リクエストがDjango送信を介して送信されなかった場合、formPOSTはmutableフォーム検証がないためです。
あなたはいつでもこのようなことをすることができます:(@ leo-the-manicのコメントに従って)
# .....
mutable = request.POST._mutable
request.POST._mutable = True
request.POST['some_data'] = 'test data'
request.POST._mutable = mutable
# ......
更新:
この場合、ポイント1と3は無効であるとGareth Reesは正しかった。ポイント2と4はまだ有効だと思いますが、ここではここに残しておきます。
(私はrequest.POSTPyramid(Pylon)とDjangoの両方のオブジェクトが何らかの形式であることに気づきましたMultiDict。ですから、おそらくそれをrequest.POST不変にするよりも一般的な方法です。)
私はDjangoの人たちのために話すことはできませんが、それはこれらの理由のいくつかのためにそれができたように思えます:
QueryDictGareth Reesが指摘したように、これは当てはまりません。request.POST、リクエストのデータを変更する必要のあるサーバー側のアクティビティはないようです。したがって、不変オブジェクトの方が適していることは言うまでもなく、パフォーマンスに大きな利点があります。dictキーとして使用できます。Djangoのどこかで非常に役立つと思います。request.POST(特にサードパーティのプラグインとの間で)パススルーすると、ユーザーからのこのリクエストオブジェクトは変更されないままになると予想できます。ある意味では、これらの理由は「不変か可変か」に対する一般的な回答でもあります。質問。Djangoの場合は、上記よりもはるかに多くの設計上の考慮事項があると思います。
sessionsが状態間でデータを取得および変更するための短期間の方法を提供する理由です。
POSTはQueryDictオブジェクトであり、これらのオブジェクトは不変であることによるパフォーマンス上のメリットがないため、この場合、あなたのポイント(1)は答えにはなりません。そして、あなたのポイント(3)は答えにQueryDictはなりません。オブジェクトはハッシュ可能ではないので、辞書キーとして使用できないからです。
QueryDict返事をする前にもっと注意を向けるべきだった。
requests.POST._mutable = True; requests.POST['foo'] = 'bar'; request.POST._mutable = False
Stack Answer https://stackoverflow.com/a/2339963のコメントでこれを見つけました
そして、遅延して構築できるように、それは不変でなければなりません。コピーにより、すべてのPOSTデータが強制的に取得されます。コピーするまで、すべてがフェッチされるとは限りません。さらに、マルチスレッドWSGIサーバーが適切に機能するためには、これが不変である場合に役立ちます
注意:multipartDjango 1.11以降のリクエストは不変です
https://github.com/django/django/blob/stable/1.11.x/django/http/multipartparser.py#L292
以前のバージョンでは変更可能でした。
request.POST実際よりも多くのデータを使用して送信されたインプレッションを作成できます。