Djangoの仕組み ~MTVモデル~
Webサーバーは、「リクエスト情報」を受け取り、適切な「レスポンス情報」を返します。 受け取った「リクエスト情報)から「レスポンス情報」を返すまでの流れを見ておくと、イメージしやすくなります。
これは次のブログがわかりやすいです。
http://farewell-work.hatenablog.com/entry/2017/05/07/160836
リンク先のブログに書いてある図のように、まずはDjangoの中のUrlが、リクエストの「URL」を受け取ります。そのあと、次のように処理が進んでいきます。
- Url
Project側で受け取ったUrlがどのApplicationを呼び出しているのかを判断します。そして、Application内でどのViewを呼ぶのかを選択します。なので、リクエストの「URL」をDjango Projectの「Url」が受け取って、まずはどのApplicationが処理するかを判断します。
そのあと、Applicationの「Url」が受け取り、どの「View」を呼び出すかを判断して渡します。
- View
呼び出された「View」は情報を集めます。処理に必要なデータを「Model」とやりとりして、(必要に応じて)「Form」によるチェックをおこない、利用する「Template」を呼び出します。 - Model
データを保持・管理するデータベースと考えるとわかりやすいと思います。 - Form
リクエスト情報が正しいかチェックしたり、htmlのformタグを作ります。 - Template
レスポンス情報のHTMLファイル。Viewで指定されたTemplate名のHTMLファイルを渡します。
つまり、まず「リクエスト情報」がきたらそのURLをみて、どの「Application」に渡すかを判断して、さらにどの「View」を呼び出すかを判断・・・のように処理が進んでいきます。
今回は、まずApplicationを作成して、「リクエスト情報」から「Application」に情報がわたるところを確認していきましょう。
Applicationの作成
では、プロジェクトにApplicatioを作っていきましょう。今回は、「start」というApplicatioを作ることにしましょう。以下のコマンドを入力してください。
python manage.py startapp start
すると、startというフォルダが自動生成されます。
新しく作成されたフォルダの中をみると、必ず存在するファイルが「–init–.py」です。これは、そのフォルダがPython Packageであることを表します。Python Packageで館律することで、import分により、Python Package内のpythonファイルを呼び出すことができます。
- manage.pyについて
Djnagoフレームワークは、Terminalにコマンドを入力することで、自動で必要なファイルを生成してくれる便利な機能があります。今回、Applicationを作るときも使いましたね。これは次のような書式となっています。
python manage.py XXXX
このmanage.pyを実行することで、xxxxに指示した動作を自動でやってくれます。※今回はstartappでしたね。
ProjectにApplicationを認識させる
さて、Applicationを作成することができました。「Djangoの仕組み」の部分に記載したように、「リクエスト情報」がくると、「Project」の「Url」がまずはどの「Application」に渡すかを判断するのでした。それには「Project」に「Application」を認識させる必要があります。ここでは、最終的に呼び出したApplicationがViewを呼び出して、「レスポンス情報」を返す処理までをおこないます。作業手順は次のようになります。
- ProjectにApplicaionを認識させる
- ProjectのurlsでApplicationのurlsを呼び出す
- Urlsを作成
- Viewを作成
ProjectにApplicationを認識させる
ProjectにApplicationを認識させるには、configフォルダの中のsetting.pyにApplicationの情報を書き込みます。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'start',
]
今回作成したApplicationはstartなので、setting.pyでINSTALLED_APPSの記述を見つけて、startを加えます。これえProjectに新しいApplicationである「start」を認知させることができました。
ProjectのurlsでApplicationのurlsを呼び出す
次に、Projectが「リクエスト情報」を受け取ったときに、まず最初にする処理である、どのApplicationに渡すか、を判断する部分を設定します。まだ、どのApplicationに渡すかが決まっていないので、configの中のurls.pyに情報を書き込みます。
from django.contrib import admin
from django.urls import include # 追記
from django.urls import path
urlpatterns = [
path('admin/', admin.site.urls),
path('start/', include('start.urls')), # 追記
]
これで、http://xxx.xxx.xxx./startのようなリクエストが呼び出された時には、startというApplicationに渡すことができるようになりました。
Urlsを作成
さて、「リクエスト情報」をProjectが受け取って、どのApplicationに渡すかまでの設定が終わりました。次は、Application内でのUrlの処理になります。新しく作成したstart というApplication内には、urls.pyがないため、まずはこれを作成します。
from django.urls import path
from . import views
app_name = 'start'
urlpatterns = [
path('', views.index, name='start_django'),
]
最後のpath(”, views.index, name=’start_django’)の部分は、
URLに、何も記載されていない場合は、views.pyのindexを呼ぶ
という意味になります。 これは次のような書式になっています。
path( URLのパターン , 呼び出すView , 名前 )
Viewsを作成
最後にViewsを作ります。 上記のurls.pyで呼び出されているIndexView の部分です。startというフォルダの中のviews.pyを編集していきます。
from django.http import HttpResponse # 追記
from django.shortcuts import render
def index(request): # 追記
return HttpResponse("Hello, Djnago!!") # 追記
ここでは、indexというメソッドを定義し、”Hello, Django!!”という文字列をレスポンスデータとして返しています。
from django.http import HttpResponse
の部分で、文字列などの情報をResponseデータ形式にしてくれています。
まとめ
さて、これで新規で作成したApplicationに関する設定がひとまず終わりました。最後に、Applicatioの起動を確認して終わりにしましょう。
サーバーを立ち上げて、https://127.0.0.1:8000/start/ にアクセスして、「Hello Django」と表示されたら成功です。
コメント