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