Django超入門シリーズ(ブログを作るチュートリアル) ~ その2 リクエストとレスポンスの基礎 ~

2021年12月30日Django超入門Django,リクエスト,レスポンス,超入門

DjangoBabyのロゴ

前回は、Djangoでサーバーを立ち上げ、言語とタイムゾーンの設定を日本用に変更するところまでやりました。

さて今回は、「リクエストレスポンスというWebの基本的な通信方法と何か?? またDjangoではそれらをどうやって実装するのか??」ということを学んでいきましょう!

本記事での目標

本記事での目標は、2つあります。

  1. リクエストとレスポンスという概念を理解する
  2. Djangoでリクエストとレスポンスを実装する

本記事が終わる時には↓のようなページを表示させられるようになります。

また、今回扱う範囲のコードはこちらにあります。わからない場合は、どんどん参考にして下さい!

リクエストとレスポンスとは?

Web開発をしていく際において、基本的には↑のような形式で通信が行われます。

① ユーザーのPC (クライアント) が Django (サーバー) に、欲しい情報をURLで指定して要求(=リクエスト)する

② URLに応じた情報を、Django (サーバー) がユーザーのPC (クライアント) に返す(=レスポンス)する

本記事で扱うリクエストの種類

本記事では、↓のような4パターンのリクエストについて扱っていきます。

これをマスターすれば、Djangoにおける基本的なリクエストとレスポンスの扱い方は分かったと言っても良いでしょう🎉

そして最後に演習問題として、整数のパラメータを受け取って2乗したものを表示するプログラムを書いてもらいます🔥

リクエストとレスポンスをDjangoで実装する

前節で、リクエストとレスポンスという概念が何となく理解できたかと思います。

ここからは、実際にDjangoでパターン①~④を実装することを通して、リクエストとレスポンスをDjangoで実装する方法を身につけていきましょう!

パターン1: トップページを表示する

それではまず、configフォルダ内のurls.pyを開きます。

そしてurls.pyを↓のように編集してみてください。

HttpResponseをimportし、

from django.http.response import HttpResponse

top_page_funcという関数を定義し、

def top_page_func(request):
    print('Hello World!!!')
    return HttpResponse('Hello World!!!')

urlpatternsという配列に、以下を追加します。

path('hello', top_page_func),

すると、urls.pyは↓のようになるはずです。

ではurls.pyで何をしているのかというと、リスエストのURLを受け取って、レスポンスのための処理をどの関数に渡すかを決めています

具体的には、urlpatternsという配列内のpath(…)の部分で、それを定めています。

今回は、’hello’というURLが来たらtop_page_funcという関数に処理を渡す、という風になっています。(その上のadminという文字が入っている行は一旦無視してください)

top_page_func関数では、レスポンスとして’Hello World!!!’という文字列を返すという処理を行っています。(また、print関数で’Hello World!!!’をターミナルに表示させる処理も行っています)

ここで、ブラウザで http://localhost:4989/hello にアクセスしてみましょう!

↓のような画面が表示されたら成功です🎉

また、views.pyの中で書いたprint('Hello World!!!')も↓のようにターミナルでも無事表示されました🎉

パターン2: 文字列のパラメータを受け取って表示する

次に、URLに文字列のパラメータが含まれる場合について、先程と同じように実装していきます。

そもそもURLに文字列のパラメータが含まれるとはどういうことなの??🙄」という方もいらっしゃると思いますので、ここで説明します。

URLに文字列のパラメータが含まれるとは?

例えば、/animal/dog というURLに対しては犬に関するページを、/animal/cat というURLに対しては猫に関するページを表示させたいとします。

この時、先程と同様にdog_page_func関数とcat_page_func関数をそれぞれ用意し、urlpatternsにURLと関数を追加する、という方法が考えられると思います。

しかしこの方法だと↓のように、例えば 'animal/elephant’ というURLの、象に関するページを追加する時に、また先程のようなことをしなければなりません。動物の種類が増えていくと、もっと大変になることが想像できると思います。

そこで、animal/{動物の名前}というURLの、{動物の名前} の部分をパラメータとして受け取って、そのパラメータによって処理を分ける方法が良いというわけです。

実際に使われている例として、https://ja.wikipedia.org/wiki/Django などたくさんあります。この場合はDjangoの部分が文字列のパラメータということになります。

文字列のパラメータ入りのURLリクエストをDjangoで処理する

本節では、そのような文字列のパラメータが含まれるURLのリクエストを、Djangoで上手く処理する方法を身につけていきましょう!

では、urls.pyを↓のように編集してみてください。

animal_page_funcという関数を定義し、

def animal_page_func(request, animal_name):
    print(animal_name)
    return HttpResponse('このページは' + animal_name + 'についてです!')

urlpatternsという配列に、以下を追加します。

path('animal/<str:animal_name>', animal_page_func),

今回はurlpatternsという配列内のpath(…)のURLの部分に、<str:animal_name>というものが含まれています。これが、URLに含まれる文字列のパラメータの部分ということになります。

例えばURLが /animal/dogの場合は、animal_nameにdogが入ります。

このようにして、動物の名前をanimal_nameとして受け取って、それをanimal_page_func関数に渡します。

animal_page_func関数では、animal_nameを受け取り、それを用いてレスポンスを作成しています。

今回は、’このページは’ + animal_name + 'についてです!’という文字列を返すレスポンスとなっています。

ここで、ブラウザで http://localhost:4989/animal/doghttp://localhost:4989/animal/cat にアクセスしてみましょう!

それぞれ↓のような画面が表示されたら成功です🎉

パターン3: 整数のパラメータを受け取って表示する

今回は、パターン②の整数バージョンとなります。URLに含まれるパラメータを受け取る方法以外全く同じなので、すんなりと理解できると思います。

実際に使われている例として、https://www.airbnb.jp/rooms/46554538 などたくさんあります。この場合は46554538の部分が整数のパラメータということになります。

それでは、整数のパラメータが含まれるURLのリクエストを、Djangoで上手く処理する方法を身につけていきましょう!

では、urls.pyを↓のように編集してみてください。

handle_numberという関数を定義し、

def handle_number(request, number):
    print(number)
    return HttpResponse('あなたは'+str(number)+'番を入力しました!!!')

urlpatternsという配列に、以下を追加します。

path('num/<int:number>', handle_number),

今回はurlpatternsという配列内のpath(…)のURLの部分に、<int:number>というものが含まれています。これが、URLに含まれる整数のパラメータの部分ということになります。

例えばURLが 'num/1’の場合は、numberに1が入ります。

このようにして、整数値をnumberとして受け取って、それをhandle_number関数に渡します。

handle_number関数では、numberを受け取り、それを用いてレスポンスを作成しています。

ここで、ブラウザでhttp://localhost:4989/num/1にアクセスしてみましょう!

↓のような画面が表示されたら成功です🎉

パターン4: クエリパラメータを受け取って表示する

いよいよ最後のパターンです🔥

さて…また「クエリパラメータ」という聞き慣れない言葉が出てきたかもしれません😫

ご安心ください!今回も、説明させていただきます!

クエリパラメータとは?

「クエリパラメータ」というのは、さまざまな情報をサーバーに伝えるためにURLに付け加える情報です。

例えば、https://www.google.com/search?q=django%20baby というURLは、Googleで「django baby」と検索した場合に生成されるURLです。この、?q= の後の部分に注目して下さい。ここには、検索キーワードである「django baby」という文字列が入っています。('%20’ は半角スペースを表すものです)

これにより、検索されたページを返す処理を行うサーバーは、『searchページを「django baby」というキーワードに応じて変化させたもの』を返すのだな、と分かります。

つまりは、「django baby」というキーワードの検索結果ページが返されるわけです↓

クエリパラメータ入りのURLリクエストをDjangoで処理する

本節では、そのようなクエリパラメータが含まれるURLのリクエストを、Djangoで上手く処理する方法を身につけていきましょう!

まず、urls.pyを↓のように編集してみてください。

search_funcという関数を定義し、

def search_func(request):
    search_word = request.GET['q']
    print(search_word)
    return HttpResponse('あなたは'+search_word+'を検索しました!!!')

urlpatternsという配列に、以下を追加します。

path('search/', search_func),

今回はurlpatternsという配列内のpath(…)のURLの部分に、<q:search_word>というものが含まれています。これが、URLに含まれるクエリパラメータの部分ということになります。

例えばURLが 'search/?q=ye-connect’の場合は、search_wordに’ye-connect’が入ります。

このようにして、クエリパラメータをsearch_wordとして受け取って、それをsearch_func関数に渡します。

search_func関数では、search_wordを受け取り、それを用いてレスポンスを作成しています。

ここで、ブラウザでhttp://localhost:4989/search/?q=ye-connectにアクセスしてみましょう!

↓のような画面が表示されたら成功です🎉

演習: 整数のパラメータを受け取り、それを2乗したものを表示する

さて、ここまで4パターンのリクエストについて、手を動かしながら理解してきました!

最後に、今までの知識を用いて整数のパラメータを受け取り、それを2乗したものを表示するようにurls.pyを編集してみて下さい🔥

特にパターン③の知識を使います。

ただし、URLは/square/{整数パラメータ}とし、整数パラメータはnumberで受け取って下さい。(もちろん、この通りにする必要はありませんが、解答ではそのように書いています)

解答はこちらにあります。わからない場合でも、解答を読んで理解できれば問題ないです!

まとめ & 次回予告

今回のまとめです。

まとめ1.ユーザが入力したURLを受け取るのはurls.pyのurlpatterns

まとめ2.URLを変数にしたいときは、それが文字列なら<str:変数名>、整数なら<int:変数名>とする

まとめ3.urlpatternsで指定したURLに対応する関数でやりたい処理、表示するページを決める。

まとめ4.<str:変数名>などは、処理する関数の第2引数で受け取れる

今回は「リクエストとレスポンスの理解」 & 「Djangoでのリクエストとレスポンスの実装」をクリアしました🎉

これでリクエストとレスポンスというWebの基礎をマスターしました!

次回は、「urls.pyを見やすく分割する(=Djangoでアプリを作成する)」です!引き続き頑張っていきましょう🔥