Djangoの中でコードを書いていると、今何をしているのかよくわからない。と思うこともあるかもしれません。
今書いているコードの意味が分からないと、学習効果も下がってしまいます。
そこで今回は、Djangoの原則について理解をしていきましょう。
Djangoがやっていることは、リクエストを受け取ってレスポンスを返すということです
結論からお伝えすると、Djangoがやっていることは、リクエストを受けてレスポンスを返しているということです。
ただ、Djangoでは内部で何かごちゃごちゃとして処理をしているので、何をしているのか分からなくなってしまいがちですが、このポイントをおさえておくと、学習効果がとても高まります。
ここから、リクエストを受けてレスポンスを返すということについてもう少し突っ込んでみていきましょう。
Djangoのオフィシャルサイトで確認
まずは、Djangoのオフィシャルサイトに書かれている内容の抜粋です。
参照元(request and response objects)はこちらです。
(日本語ページの文章だと少し分かりづらいので、英語の文を載せています。)
When a page is requested, Django creates an HttpRequest object that contains metadata about the request. Then Django loads the appropriate view, passing the HttpRequest as the first argument to the view function. Each view is responsible for returning an HttpResponse object.
これを訳すと(少し意図的に訳しています)、以下のような感じになります。
ブラウザにurlを打ち込むと、Djangoの内部ではそのリクエストに関するメタデータ(methodなどの情報)などの情報を含んだHttprequestオブジェクトが作られます。
それから、Djangoはurls.pyファイルに対応したviews.pyファイルの中のview(function based viewまたはclass based view)を呼び出します(この時、引数としてHttpReauestオブジェクトが使われます)。
そして、viewの中で適切な処理が実行された後、viewはHttpResponseオブジェクトをサーバーに返します。
つまり、Djangoがやっていることは、リクエストを受け取って、レスポンスを返しているということなのです。
リクエストを受けて、レスポンスを返していることをコードで確認する
次に、実際のコードを見ながら、viewがリクエストを受けてレスポンスを返しているということを確認していきましょう。
コード-views.py
def sample(request):
print(request)
response = HttpResponse('')
print(response)
return response
requestとresponseをprint関数で出力して、それぞれがどのようなデータなのかを見ていきましょう。
コマンドライン<WSGIRequest: GET '/hello/'>
<HttpResponse status_code=200, "text/html; charset=utf-8">
このような表示がでました。ここで、WSGIRequestがrequestに対応しており、HttpResponseがresponseに対応しています。
つまり、viewはrequestを受け取り、responseを返しているということを確認することができました。
ちなみに、WSGIというのはアプリケーションサーバーのことで、このサーバーがrequestオブジェクトを作ってくれています。
WSGIは少しレベルが高い内容ですが、ざっくりとしたイメージとしては、ブラウザが受け取ったurlをもとに、requestオブジェクトを作るという役割を果たしています。
複雑なコードを書く場合でも、結局はリクエストを受けてレスポンスを返しているだけ
これからコードを書いていく中では、複雑なコードを書く場合があるかと思います。
ただ、その時でもDjangoがやっているのはリクエストを受け取ってレスポンスを返しているだけということを意識しておきましょう。
リクエストとレスポンスの間に複雑なコードが書かれるかもしれませんが、結局やっていることはリクエストを受けてレスポンスを返しているだけです。
class based viewの場合も同じ
また、class based viewの場合でも、やっていることは同じということを頭に入れておきましょう。
class based viewの場合、明示的にリクエストを受け取ってレスポンスを返すということをやっていませんので、さらにDjangoが何をしているのか分からなくなってしまうのですが、結局やっていることは同じということを頭に入れておきましょう。