タイトルが尋ねるように、なぜDjango guysはquerydictでrequest.POSTオブジェクトを実装することを決定しました(もちろん、これは全体を不変にしますか?)
投稿データのコピーを作成することでmutifyできることを知っています
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 POST
オブジェクトが不変であることmultipart
以外のリクエストの場合。
リクエストがDjangoform
送信の結果である場合、 POST beingimmutable
)データの整合性を確保する between形式submissionおよび形式validation。ただし、リクエストがnotでDjangoform
提出、次にPOST ismutable
フォーム検証がないため。
いつでも次のようなことができます:( @ leo-the-manic's comment )
# .....
mutable = request.POST._mutable
request.POST._mutable = True
request.POST['some_data'] = 'test data'
request.POST._mutable = mutable
# ......
更新:
Gareth Reesは、この場合、ポイント1と3が無効であると言っていました。ポイント2と4はまだ有効だと思いますが、ここでこれらを残します。
(Pyramid(Pylon)とDjangoの両方のrequest.POST
オブジェクトがMultiDict
の何らかの形であることに気付きました。 request.POST
を不変にするよりも練習します。)
Django guysについて話すことはできませんが、これらの理由のいくつかのためにそれができるように思えますが:
QueryDict
には当てはまりません。request.POST
の場合、サーバー側のアクティビティはrequest'sデータを変更する必要がないようです。したがって、不変オブジェクトは、パフォーマンスに大きな利点があることは言うまでもなく、より適しています。dict
キーとして使用できます。これは、Djangoのどこかで非常に便利ですsuppose。request.POST
(特にサードパーティのプラグインに)を渡すと、ユーザーからのこのリクエストオブジェクトは変更されないままであると期待できます。何らかの意味で、これらの理由は「不変vs可変」に対する一般的な答えでもあります。質問。 Djangoの場合、上記よりもはるかに多くの設計上の考慮事項があります。
デフォルトでは不変であることが好きです。指摘したように、必要に応じて変更可能にすることができますが、明示的にする必要があります。 「フォームのデバッグを悪夢にすることはできるが、今何をしているのかは知っている」というようなものです。
Stack Answerのコメントでこれを見つけました https://stackoverflow.com/a/233996
そして、それは遅延なく構築できるように不変でなければなりません。コピーは、すべてのPOSTデータを強制的に取得します。コピーまでは、すべてがフェッチされるとは限りません。さらに、マルチスレッドWSGIサーバーが適切に機能するためには、これが不変
注:multipart
リクエストは、Django 1.11 https://github.com/Django/django/blob/stable/1.11.x/Django/ http/multipartparser.py#L292
以前のバージョンでは変更可能でした。