Pythonを学ぶ中で、djangoというWEBフレームワークを触っていて、全体的な概念がいまいちつかめずいろいろと調べた結果、なんとなく分かってきたのでここに整理したい。
HTTPメソッドとしては、GET/POST以外にもHEAD/DELETEなど多くあるが、djangoにおいて原則GET/POSTの処理さえできれば大体なんでもできるので(多分)、その2つのメソッドについてのみ整理した。
各ファイルの説明
- urls.py
- views.py
- URLに応じた処理を記述するファイル
- model.py
- forms.py
- djangoによってフォームを生成させるための処理を記述する。
- model.pyを参照して、どのデータをフォームとして使うかを記述。
GETリクエストの流れ
- ユーザがGETのHTTPリクエストを送る
- djangoは、urls.pyを参照してパスを探す
- パスが見つかれば、views.pyに記載の関数に飛ぶ
- views.pyに定義された関数に基づきtemplateフォルダ配下のhtmlを参照する
- 「テンプレートをロードしてコンテキストに値を入れ、テンプレートをレンダリングした結果を HttpResponse オブジェクトで返す」
POSTリクエストの流れ
POSTリクエストを送る場合でも、まず初めにGETでフォーム自体をHTTPレスポンスとして返す。ユーザは、表示されたフォームに値を入力してPOSTで送り返す。 以下の例はdjangoの公式チュートリアルから転記したコード。
def get_name(request): # if this is a POST request we need to process the form data if request.method == 'POST': # create a form instance and populate it with data from the request: form = NameForm(request.POST) # check whether it's valid: if form.is_valid(): # process the data in form.cleaned_data as required # ... # redirect to a new URL: return HttpResponseRedirect('/thanks/') # if a GET (or any other method) we'll create a blank form else: form = NameForm() return render(request, 'name.html', {'form': form})
request.method == 'POST'
にて、GETかPOSTかをチェックして、初回のアクセス(GET)であればフォームのhtmlを生成して返す。POSTであれば、内容をチェック(if form.is_valid()
)して、処理を継続する。