112

タイトルが示すように、なぜDjangoの連中はquerydictを使用してrequest.POSTオブジェクトを実装することにしたのですか(もちろん、これにより全体が不変になりますか?)

投稿データのコピーを作成することで変更できることを知っています

post = request.POST.copy()

しかし、なぜこれを行うのですか?とにかく物事を変更可能にするだけの方が簡単でしょう?それとも、問題を引き起こす可能性のある他の理由でも使用されていますか?

4

6 に答える 6

135

ちょっと謎ですね。いくつかの表面的にもっともらしい理論は、調査の結果、間違っていることが判明しました:

  1. POSTオブジェクトがミューテーション メソッドを実装する必要がないようにするには?いいえ:オブジェクトは、 、、およびを含む変更メソッドの完全なセットを実装するクラスPOSTに属します。ミューテーション メソッドの 1 つを呼び出すときにフラグをチェックすることで、不変性を実装します。メソッドを呼び出すと、可変フラグがオンになっている別のインスタンスが取得されます。django.http.QueryDict__setitem____delitem__popclearcopyQueryDict

  2. パフォーマンス向上のため?いいえ:QueryDictミュータブル フラグをオフにすると、クラスのパフォーマンスは向上しません。

  3. POSTオブジェクトを辞書のキーとして使用できるようにするには? いいえ:QueryDictオブジェクトはハッシュ可能ではありません。

  4. ここで主張されているように、POSTデータを遅延して(応答全体を読み取ることをコミットせずに)構築できるようにするには?コードにこれの証拠はありません。私が知る限り、応答全体が直接またはfor応答を介して常に読み取られます。MultiPartParsermultipart

  5. プログラミング エラーから保護するには? これが主張されているのを見たことがありますが、これらのエラーが何であるか、および不変性がどのようにそれらからあなたを保護するかについての適切な説明を見たことはありません.

いずれにせよ、POST常に不変であるとは限りません。応答がmultipartの場合、POSTは変更可能です。これは、あなたが考えるかもしれないほとんどの理論にキボッシュを置くようです. (この動作が見落としでない限り。)

要約すると、Django では、オブジェクトが非リクエストに対して不変であるという明確な根拠はわかりません。POSTmultipart

于 2012-09-27T10:54:56.773 に答える
86

リクエストが 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
# ......
于 2014-01-21T15:25:45.287 に答える
5

更新

この場合、ポイント 1 と 3 は無効であるという Gareth Rees の意見は正しかった。ポイント2と4はまだ有効だと思いますが、ここでは論文を残します。

request.POST(私は、Pyramid(Pylon) と Django の両方のオブジェクトが何らかの形であることに気付きました。おそらく、不変MultiDictにするよりも一般的な方法です。)request.POST


私は Django の人たちを代弁することはできませんが、次の理由のいくつかが原因であると思われます:

  1. パフォーマンス。不変オブジェクトは、大幅な最適化を可能にするという点で、可変オブジェクトよりも「高速」です。オブジェクトが不変であることは、作成時にスペースを割り当てることができることを意味し、スペース要件は変わりません。そのため、コピー効率や比較効率などもあります。 編集QueryDictGareth Reesが指摘したように、これは当てはまりません。
  2. の場合、サーバー側のアクティビティでリクエストのデータrequest.POSTを変更する必要はないようです。したがって、不変オブジェクトの方が適しています。言うまでもなく、パフォーマンスが大幅に向上します。
  3. dict 不変オブジェクトはキーとして使用できます。これはDjangoのどこかで非常に役立つと思います。編集:私の間違いです。ただし、ハッシュ可能なオブジェクトは通常、不変でもあります。
  4. (特にサードパーティのプラグインなどに)渡す場合request.POST、ユーザーからのこの要求オブジェクトは変更されないままであると予想できます。

ある意味、これらの理由は「不変 vs 可変?」に対する一般的な回答でもあります。質問。Django の場合、上記よりもはるかに多くの設計上の考慮事項があると確信しています。

于 2012-09-27T01:55:59.653 に答える
2

Stack Answer https://stackoverflow.com/a/2339963のコメントでこれを見つけました

また、遅延ビルドできるように不変でなければなりません。コピーにより、すべての POST データが強制的に取得されます。コピーまでは、すべて取得できない場合があります。さらに、マルチスレッド WSGI サーバーが適切に機能するには、これが不変であると役立ちます。

于 2014-04-30T22:40:43.527 に答える