(最終更新月:2022年8月)
✔このような方へ向けて書かれた記事となります
「Djangoのrequestってなに?」
「requestの属性で何ができるのか知りたい!」
「requestを使った実例を教えてほしい」
✔当記事を通じてお伝えすること
- Djangoのrequestとは何か?
- requestの属性一覧
- requestのメソッド一覧
- requestを使った実例
当記事を最後までご覧いただければ、requestとは何かや属性についてはもちろん、requestを使ってどのようなことができるのかまで理解いただけます。
ぜひ最後までご覧ください。
Djangoのrequstとは?
こちらではDjangoのrequestについて、以下のことを解説していきます。
- Djangoのrequestとは何なのか?
- HTTP通信におけるリクエストとレスポンスについて
Djangoでは、View関数を記述するときやテンプレートでユーザー情報を取得するときにrequestを使う機会があります。
ここで仕組みを理解しておけば、さまざまな場面で応用できることは間違いありません。
requestはHttpRequestオブジェクト
Djangoの記述で出てくる「request」は、Django特有のHttpRequestクラスのオブジェクトです。
リクエスト時の情報をまとめて、HttpRequestオブジェクトの属性にさまざまなデータを格納しています。
たとえば、リクエストをしたユーザー情報を受け取りたいときは、「user」属性を使います。
request.user
のちほど「request」に用意された属性も全て見ていきますが、ここではrequestがHttpRequestオブジェクトであることと、さまざまなデータが自動的に格納されていることを覚えておきましょう。
そもそもリクエストとかレスポンスって何なの?
DjangoのrequestがHttpRequestのオブジェクトであることはなんとなくご理解いただけたと思います。
ただそもそも、リクエストって何でしょうか?
簡単にいえば、リクエストは、ブラウザにURLを打ち込むことだといえます。
URLを打ち込むことで、特定のデータを表示するよう注文しているとも言い換えられます。
対して、レスポンスはデータを表示することです。
打ち込まれたURLに対応しているデータを表示するか、データが存在しない場合に404エラーなどのレスポンスを返します。
リクエストとレスポンスは、Djangoのアプリを公開するサーバー構築においても重要です。
詳しくはこちらの記事でも解説しています。
HttpRequestの属性一覧
HttpRequestオブジェクトの属性をご覧いただきます。
なぜなら属性がわかれば、格納されているデータがどこにあるかがわかるから。
全て覚えておく必要はありませんが、どんなものがあるかだけイメージできるようにしておきましょう。
※公式ページを参考に実例付きでわかりやすく解説しています。
HttpRequest.scheme
scheme属性には、「http」か「https」の文字列が格納されています。
リクエストのスキームが格納されています。
ローカルサーバーで実行した場合は、以下のようになります。
http
HttpRequest.body
body属性には、HTTPリクエスト時の本文がバイト文字列で格納されています。
フォームなどを使わずにデータをやり取りしたいときに使えますが、あまり使う機会はありません。
通常のページでご覧いただくと以下のように空っぽの値が返ります。
b''
HttpRequest.path
path属性を使うと、リクエスト時の相対パスが格納されています。
相対パスとは、ドメイン以下のパスのことをいいます。
当ページであれば、「/django/django-requeset/」となります。
トップページでリクエストをおこなえば、以下の文字列が返ります。
/
HttpRequest.path_info
path_info属性もpath属性と同じ様に相対パスが格納されています。
path属性との違いは、path_info属性であればローカルとデプロイ環境でパス設定が違う場合などにも対応できることです。
ローカル環境のトップページでリクエストをおこなう場合は以下のとおり、path属性と同じ値が返ります。
/
HttpRequest.method
method属性には、リクエスト時のメソッドが格納されています。
ページにアクセスした場合は”GET”、POSTメソッドを使ったフォームで送信した場合は”POST”が返ります。
HttpRequest.encoding
encoding属性には、フォーム送信の際に使われるエンコーディングを文字列が格納されています。
ただし、デフォルトのエンコーディングの場合は、”None”が返ります。
HttpRequest.content_type
content_type属性には、リクエスト時のMIMEタイプを文字列が格納されています。
HTML上の「CONTENT_TYPE」から識別したものです。
通常のページでおこなえば以下のとおり。
text/plain
HttpRequest.content_params
content_paramsは、CONTENT_TYPEに含まれるパラメータを辞書型を格納しています。
基本的には空の辞書が返ります。
{}
HttpRequest.GET
GETメソッドは、ページにアクセスした際に、HTTP GETパラメータを辞書型で返します。
GETメソッドで作った検索フォームなどで使われることが多いです。
たとえば、以下のようなURLを打ち込めばGET属性には値が格納されます。
<QueryDict: {'search': ['公開']}>
HttpRequest.POST
POSTメソッドは、HTTP POSTパラメータを辞書型で返します。
問い合わせやデータ登録のフォームなど、POSTメソッドフォームの送信時にリクエストを受け取ります。
POSTフォームについては、以下の記事で実例付きの解説をしています。
HttpRequest.COOKIES
COOKIES属性では、すべてのクッキーが格納されています。
シンプルなHTMLページでの例は以下のとおり。
{'SL_G_WPT_TO': 'ja', 'SL_GWPT_Show_Hide_tmp': '1', 'SL_wptGlobTipTmp': '1'}
HttpRequest.FILES
FILES属性は、アップロードされたファイルが辞書型で格納されます。
単にページにアクセスしただけでは以下のとおりです。
<MultiValueDict: {}>
もしファイル送信をするならまずは以下のようなフォームを作り、送信します。
<form method="POST" enctype="multipart/form-data">{% csrf_token %}
<input type="file" name="test_file" />
<input type="submit" />
</form>
ファイルをアップロードすると以下のように表示されます。
<MultiValueDict: {'test_file': [<InMemoryUploadedFile: image.jpg (image/jpeg)>]}>
HttpRequest.META
META属性には、すべてのHTTPヘッダーが辞書型で格納されています。
たとえば、以下のようなヘッダーが存在します。
- CONTENT_TYPE
- HTTP_HOST
- REMOTE_HOST
- REMOTE_USER
- SERVER_NAME
HttpRequest.headers
headers属性には、HTTPヘッダーが辞書型で格納されています。
ローカル環境でのヘッダーを取得すると以下の通りでした。
{'Content-Length': '',
'Content-Type': 'text/plain',
'Host': '127.0.0.1:8000',
'Connection': 'keep-alive',
'Cache-Control': 'max-age=0',
'Sec-Ch-Ua': '"Chromium";v="104",
" Not A;Brand";v="99",
"Google Chrome";v="104"',
'Sec-Ch-Ua-Mobile': '?0',
'Sec-Ch-Ua-Platform': '"Linux"',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'Sec-Fetch-Site': 'none',
'Sec-Fetch-Mode': 'navigate',
'Sec-Fetch-User': '?1',
'Sec-Fetch-Dest': 'document',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'ja,en-US;q=0.9,en;q=0.8,la;q=0.7',
'Cookie': 'SL_G_WPT_TO=ja; SL_GWPT_Show_Hide_tmp=1; SL_wptGlobTipTmp=1
}
HttpRequest.resolver_match
resolver_match属性には、urls.pyで設定したパス情報が格納されています。
シンプルな以下の設定をしたパスを例としてご覧いただきます。
from django.urls import path
from .views import myapp_list_view
urlpatterns = [
path("", myapp_list_view)
]
resolver_match属性には以下が格納されていました。
ResolverMatch(func=myapp.views.myapp_list_view, args=(), kwargs={}, url_name=None, app_names=[], namespaces=[], route='')
HttpRequest.session
session属性は、SessionMiddlewareのオブジェクトが格納されています。
<django.contrib.sessions.backends.db.SessionStore object at 0x7f2c58c0a730>
HttpRequest.user
user属性には、リクエストをしたユーザー情報が格納されています。
ログインしていないユーザーは、「AnonymousUser」です。
AnonymousUser
HttpRequestのメソッド一覧
HttpRequestオブジェクトには、属性だけでなく、メソッドも用意されています。
使えるものを一つ一つ見ていくことで、いろいろな場面で応用がきくようになります。
ざっと目を通すだけでもぜひご覧ください。
※公式ページを参考に実例付きでわかりやすく解説しています。
HttpRequest.get_host()
get_hostメソッドは、ドメイン名を取得できます。
ローカルサーバーで実行すれば以下のような結果となります。
127.0.0.1:8000
HttpRequest.get_port()
get_portメソッドは、ポート番号を取得します。
ローカルサーバーで実行すれば以下のような結果となります。
8000
HttpRequest.get_full_path()
get_full_pathメソッドは、path属性を返します。
トップページで実行すれば以下のような結果となります。
/
HttpRequest.get_full_path_info()
get_full_pathメソッドは、path_info属性を返します。
トップページで実行すれば以下のような結果となります。
/
HttpRequest.build_absolute_uri(location=None)
build_absolute_uriメソッドは、ドメインも含めたURLを取得できます。
ローカル環境のトップページで実行すると以下のとおりになります。
http://localhost:8000/
HttpRequest.is_secure()
is_secureメソッドは、通信がセキュアであるかどうかをBoolean型で返します。
HTTPS通信であれば「True」、HTTP通信であれば「False」です。
ローカル環境では以下のとおり。
False
【実例】requestの使い方まとめ
こちらでは「request」を使った実例をご紹介していきます。
実例を見ることで、どんなものであれば自作アプリに落とし込めるのかをイメージしやすくなります。
- user属性を使って、ユーザー情報を取得する方法
- user属性を使って、ログイン情報を識別する方法
- 検索機能の作り方&request.GETの使い方
- View関数での使い場所
- ユーザー別に動的なページを作る方法(中級以上)
user属性を使って、ユーザー情報を取得する方法
テンプレート上でユーザー情報を取得する方法は以下のとおり。
{{ request.user }}
user属性を使って、ログイン情報を識別する方法
user属性を使えば、ログインしているかどうかを識別できます。
request.user.is_authenticated
詳しくはこちらをご覧ください。
検索機能の作り方&request.GETの使い方
request.GETを使えば、検索機能を作れます。
もちろんrequestの使い方だけではできませんが、以下の記事を参考に進めれば必ずできるようになります。
View関数での使い場所
View関数では、引数やrenderメソッド内でリクエストが使われます。
View関数の作り方などは以下の記事でご覧ください。
ユーザー別に動的なページを作る方法(中級以上)
requestを活用して、user別の動的なページを作れます。
応用した一例として参考までにご覧ください。
まとめ:requestには、たくさんの情報が詰まっている
当記事の内容をまとめます。
- Djangoのrequestとは、リクエスト時の情報をまとめたHttpRequestのオブジェクト
- requestには、さまざまな使える属性やメソッドがある
requestは一度覚えれば、とても便利です。
たくさんの情報が詰まっているからです。
ぜひ何か困ったことがあれば、当記事や当ブログに戻ってきてください。