'sqr'atch-note

ちりはつもれど ちりぬるを

djangoの要素整理

Pythonを学ぶ中で、djangoというWEBフレームワークを触っていて、全体的な概念がいまいちつかめずいろいろと調べた結果、なんとなく分かってきたのでここに整理したい。

HTTPメソッドとしては、GET/POST以外にもHEAD/DELETEなど多くあるが、djangoにおいて原則GET/POSTの処理さえできれば大体なんでもできるので(多分)、その2つのメソッドについてのみ整理した。

各ファイルの説明

  • urls.py
    • djangoが、リクエストURLに対応したページへルーティングさせるためのルールを記述するファイル
  • views.py
    • URLに応じた処理を記述するファイル
  • model.py
    • アプリで利用するデータを定義するファイル。djangoでは、Pythonのクラスとその属性を記述することでデータベーステーブルを作成する
  • forms.py
    • djangoによってフォームを生成させるための処理を記述する。
    • model.pyを参照して、どのデータをフォームとして使うかを記述。

GETリクエストの流れ

  1. ユーザがGETのHTTPリクエストを送る
  2. djangoは、urls.pyを参照してパスを探す
  3. パスが見つかれば、views.pyに記載の関数に飛ぶ
  4. views.pyに定義された関数に基づきtemplateフォルダ配下のhtmlを参照する
  5. 「テンプレートをロードしてコンテキストに値を入れ、テンプレートをレンダリングした結果を 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())して、処理を継続する。