Djangoのビュー関数にまつわる小さな好奇心、そして隠れた原理

開発者はしばしば習慣的にコードを書きます。私もDjangoでビュー関数を書く際に、何の疑いもなく request.GET.get('variable')request.POST.get('variable') を使用していました。しかし、ある日ふと思いました。

"一体これはどう機能しているのだろう?"


Djangoのリクエスト処理: request.GETrequest.POST の秘密

この質問に答えるために、Djangoの動作原理を調べてみました。結論から言うと、 request.GETrequest.POST はクライアントが送信したリクエストデータを扱いやすくした HTTPリクエストオブジェクトの属性 です。

Djangoはクライアントがサーバに送信したデータを パース(Parsing) して、 辞書のように扱える形式に変換 します。だから、私たちは簡単に request.GET.get('variable')request.POST.get('variable') で必要なデータを取得できるのです。

しかし、ここで重要な事実は、このオブジェクトが 本物の辞書(Dictionary) ではないということです。それでは 辞書のように という表現は何を意味するのでしょうか?


QueryDict: 辞書のようでありながら、辞書以上のオブジェクト

Djangoにおいて request.GETrequest.POST は実際には QueryDict というクラスのインスタンスです。このクラスは一般的な辞書と似た動作を提供しますが、いくつかの重要な違いがあります:

1. 同じキーに複数の値を保存可能

通常の辞書は一つのキーに一つの値のみを保存できますが、 QueryDict は同じキーに複数の値を保存することができます。

例えば、 ?key=value1&key=value2 のようなクエリ文字列がある場合:

request.GET.get('key')       # 'value1' (最初の値)
request.GET.getlist('key')   # ['value1', 'value2'] (すべての値)

2. 不変性(Immutable)

基本的に QueryDict は不変です。値を修正または追加するには、まずコピーを作成する必要があります:

mutable_querydict = request.GET.copy()
mutable_querydict['new_key'] = 'new_value'

3. 辞書以上の機能

getlist() のようなメソッドは通常の辞書にはありませんが、 QueryDict が提供する強力な機能の一つです。

Django QueryDict concept image

なぜこのように設計されたのか?

このように設計された理由は簡単です。ウェブアプリケーションではしばしば 同じ名前の複数のデータ を扱う必要があり、 不変性 を保つことでデータの整合性を保証することができます。 QueryDict はこれらの要件を満たしつつ、開発者が慣れ親しんだ 辞書スタイルのAPI を提供します。ユーザーは複雑なHTTPリクエストデータを単純に辞書を扱うように簡単に処理できます。


Djangoの原理を探求する楽しさ

小さな好奇心から始まった質問でしたが、答えを見つける過程でDjangoの細やかで効率的な設計に感心しました。

QueryDict の存在とその特別な機能を知ることで、Djangoがどれだけ開発者に優しいフレームワークであるかを再認識しました。

皆さんもDjangoを使用する際にふと思い浮かぶ小さな好奇心を探求してみてください。その中にはきっと新しい楽しさと感動が待っていることでしょう。 😊

Djangoの動作原理を探求しながら楽しいコーディングを! 🎉