1. ホーム
  2. django

[解決済み] django - なぜ request.POST オブジェクトは immutable なのですか?

2022-10-05 08:09:10

疑問点

タイトルにあるように、なぜ Django の人たちは request.POST オブジェクトを querydict で実装することにしたのでしょうか (もちろん、その結果、全体が immutable になるのでしょうが?)。

私は、あなたが ミューティファイ というのは、投稿データをコピーして

post = request.POST.copy()

しかし、なぜこのようなことをするのでしょうか?どうせなら、そのオブジェクトを変更可能にした方がシンプルではないでしょうか?それとも、何か他の理由で使われていて、それが問題を引き起こしているのでしょうか?

どのように解決するのですか?

ちょっと不思議な話ですよね。表面的にもっともらしいと思われるいくつかの説が、調査してみると間違っていることがわかったりします。

  1. ということは POST オブジェクトは突然変異のメソッドを実装する必要がないのですか?いいえ。 POST オブジェクトに属しています。 django.http.QueryDict クラス を含む突然変異のメソッド一式を実装しています。 __setitem__ , __delitem__ , popclear . 変異メソッドの一つを呼び出すときにフラグをチェックすることで、不変性を実装しています。また copy メソッドを呼び出すと、別の QueryDict のインスタンスを取得します。

  2. パフォーマンス向上のため?いいえ。 QueryDict クラスは、mutable フラグをオフにした場合、パフォーマンスの恩恵を受けません。

  3. そのため POST オブジェクトを辞書のキーとして使用することができますか?いいえ。 QueryDict オブジェクトはハッシュ化できません。

  4. ということは POST のデータを (レスポンス全体を読むことにコミットすることなく) 気楽に構築することができます。 はここで主張されているように ? コードにその証拠は見当たりません。私が知る限り、レスポンスの全体は常に読み込まれ、どちらかというと 直接 で、あるいは MultiPartParser の場合 multipart のレスポンスになります。

  5. プログラミングエラーから守るため?私はこの主張を見たことがありますが、これらのエラーが何であるか、そして不変性がどのようにそれらからあなたを守るかについての良い説明を見たことがありません。

いずれにせよ POST は常に不変とは限りません。 : レスポンスが multipart である場合、その後に POST はミュータブルである。これは、あなたが考えるかもしれないほとんどの理論に一石を投じるようなものです。(この動作が見落としであれば別ですが)。

まとめると 明確な根拠は見当たりません のための Django における POST オブジェクトが、非 multipart リクエストに対応します。