【Django】requestとは?使い方や実例をわかりやすく解説

Django

(最終更新月:2022年8月)

✔このような方へ向けて書かれた記事となります

「Djangoのrequestってなに?」

「requestの属性で何ができるのか知りたい!」

「requestを使った実例を教えてほしい」

✔当記事を通じてお伝えすること

  • Djangoのrequestとは何か?
  • requestの属性一覧
  • requestのメソッド一覧
  • requestを使った実例

当記事を最後までご覧いただければ、requestとは何かや属性についてはもちろん、requestを使ってどのようなことができるのかまで理解いただけます。

ぜひ最後までご覧ください。

【著者プロフィール】

profile_icon
【Python歴】11年 x 【Django歴】10年
HP作成、社内システムの構築、コンサルティング

当ブログを通じて、Webアプリの書き方やアプリの公開方法までを解説しています。

☆日報アプリ「D-Repo」(デモ版)→こちら

※Djangoをベースに作成したアプリです。

☆便利ツールアプリ「Tool Station」→こちら

※Django REST frameworkとReactで作成しているアプリです。

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属性には値が格納されます。

/?search=公開

<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は一度覚えれば、とても便利です。

たくさんの情報が詰まっているからです。

ぜひ何か困ったことがあれば、当記事や当ブログに戻ってきてください。

✔当ブログは以下のような方に向けて書かれています

「Djangoでのアプリ開発を学びたい!」

「Djangoで開発したアプリをWebで公開するにはどうするの?」

✔当ブログ掲載の記事

  • Djangoで作る日報アプリ開発
  • WebアプリをWeb上に公開する方法
  • Webアプリ開発に必要なそのほかの情報
【Django】チュートリアル|日報アプリの開発から公開まで
Djangoのチュートリアルをお探しですか?具体的に「手を動かして作ってみたい!」という方へ向けて、誰でもできる簡易的な日報アプリの開発を通じて、Djangoの様々な機能に触れていくシリーズとなっています。PythonでWebアプリを作りたい方、必見の記事となります!

公式LINEも始めました。記事更新についてや、当ブログ内の人気記事などの情報を定期的に配信しています。

友だち追加

ITCブログにご協力いただける方は、以下もご検討いただけると嬉しいです。

ITCに投げ銭をする

タイトルとURLをコピーしました