タイトルが示すように、なぜDjangoの連中はquerydictを使用してrequest.POSTオブジェクトを実装することにしたのですか(もちろん、これにより全体が不変になりますか?)
投稿データのコピーを作成することで変更できることを知っています
post = request.POST.copy()
しかし、なぜこれを行うのですか?とにかく物事を変更可能にするだけの方が簡単でしょう?それとも、問題を引き起こす可能性のある他の理由でも使用されていますか?
ちょっと謎ですね。いくつかの表面的にもっともらしい理論は、調査の結果、間違っていることが判明しました:
POST
オブジェクトがミューテーション メソッドを実装する必要がないようにするには?いいえ:オブジェクトは、 、、およびを含む変更メソッドの完全なセットを実装するクラスPOST
に属します。ミューテーション メソッドの 1 つを呼び出すときにフラグをチェックすることで、不変性を実装します。メソッドを呼び出すと、可変フラグがオンになっている別のインスタンスが取得されます。django.http.QueryDict
__setitem__
__delitem__
pop
clear
copy
QueryDict
パフォーマンス向上のため?いいえ:QueryDict
ミュータブル フラグをオフにすると、クラスのパフォーマンスは向上しません。
POST
オブジェクトを辞書のキーとして使用できるようにするには? いいえ:QueryDict
オブジェクトはハッシュ可能ではありません。
ここで主張されているように、POST
データを遅延して(応答全体を読み取ることをコミットせずに)構築できるようにするには?コードにこれの証拠はありません。私が知る限り、応答全体が直接またはfor応答を介して常に読み取られます。MultiPartParser
multipart
プログラミング エラーから保護するには? これが主張されているのを見たことがありますが、これらのエラーが何であるか、および不変性がどのようにそれらからあなたを保護するかについての適切な説明を見たことはありません.
いずれにせよ、POST
は常に不変であるとは限りません。応答がmultipart
の場合、POST
は変更可能です。これは、あなたが考えるかもしれないほとんどの理論にキボッシュを置くようです. (この動作が見落としでない限り。)
要約すると、Django では、オブジェクトが非リクエストに対して不変であるという明確な根拠はわかりません。POST
multipart
リクエストが Django 送信の結果である場合、フォーム送信とフォーム検証の間のデータの整合性を確保するためform
に POST を実行するのは合理的です。ただし、リクエストがDjango 送信を介して送信されなかった場合、 POST はフォーム検証がないためです。immutable
form
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.POST
(私は、Pyramid(Pylon) と Django の両方のオブジェクトが何らかの形であることに気付きました。おそらく、不変MultiDict
にするよりも一般的な方法です。)request.POST
私は Django の人たちを代弁することはできませんが、次の理由のいくつかが原因であると思われます:
QueryDict
Gareth Reesが指摘したように、これは当てはまりません。request.POST
を変更する必要はないようです。したがって、不変オブジェクトの方が適しています。言うまでもなく、パフォーマンスが大幅に向上します。dict
request.POST
、ユーザーからのこの要求オブジェクトは変更されないままであると予想できます。ある意味、これらの理由は「不変 vs 可変?」に対する一般的な回答でもあります。質問。Django の場合、上記よりもはるかに多くの設計上の考慮事項があると確信しています。
Stack Answer https://stackoverflow.com/a/2339963のコメントでこれを見つけました
また、遅延ビルドできるように不変でなければなりません。コピーにより、すべての POST データが強制的に取得されます。コピーまでは、すべて取得できない場合があります。さらに、マルチスレッド WSGI サーバーが適切に機能するには、これが不変であると役立ちます。