【Django】views.pyの引数resquest:HttpRequestオブジェクトの使用方法

時計 2021.07.20 / 時計

【Django】views.pyの引数resquest:HttpRequestオブジェクトの使用方法

本記事ではDjangoでリクエストを受けたときに生成されるHttpRequestオブジェクトの使用方法について解説していきます。

views.pyでは引数requestで受け取り、requestに属性やメソッドを使用してリクエスト内容を処理していきます。

HttpRequestオブジェクトは、フォームページから送られたデータの取得や、アップロードされたファイルの操作などに使用されるため、とても重要度の高い知識です。

本記事を通して以下の知識を学べます。

学べる知識
  • ブラウザでWebサイトが表示されるまでの流れ
  • HttpRequestオブジェクトについて
  • HttpRequestオブジェクトの属性

ブラウザ(クライアント)でWebサイトが表示されるまでの流れ

ユーザーがブラウザでWebサイトを閲覧する場合、クライアント側からサーバーに対してリクエストを送信します。
そしてリクエストを受けたサーバーは、リクエストの内容に基づいてレスポンスをクライアントに返します。

Djangoでも例に漏れず、この流れでリクエストとレスポンスの受け渡しを行います。

Djangoでのリクエストを受けてから、レスポンスを返すまでの処理の流れは次のようになります。

ブラウザ(クライアント)でWebサイトが表示されるまでの流れ
  1. ブラウザはサーバーにHTTPリクエストを送信
  2. urls.pyから一致するURLパターンを検索
  3. 一致したURLパターンに紐づいているviews.py内の関数を実行
  4. 関数はモデル(models.py)を通してデータベース操作を行いデータを取得
  5. templateフォルダからtemplate_nameで指定されているテンプレートを取得
  6. データベースのデータ(context)をテンプレートに反映
  7. 作成されたHTMLをHTTPレスポンスでブラウザに返す

HttpRequestオブジェクト

views.py:HttpRequestオブジェクトの受け取り

ユーザークライアントから、あるページのリクエストをDjangoサーバーが受け取ると、HttpRequestオブジェクトが生成されます。

Djangoは一致するURLパターンをurls.pyから検索し、それに紐づくビュー(関数またはクラス)を実行します。

そしてビューの引数にHttpRequestオブジェクトを渡します。
基本的に引数requestでHttpRequestオブジェクトを受け取ります。

# 例:ビュー関数indexでHttpRequestを引数requestで受け取る
def index(request):

ビュー内ではこのrequestを用いて、HTTPメソッド(GETとPOST)の判別や、アップロードされたファイルの操作などを行います。

ビューは最終的にはHttpResponseオブジェクトをクライアントに返す必要があります。

HttpResponseオブジェクトを返すメソッドであるrenderメソッドについては、以下記事で詳しく解説しています。

HttpRequestオブジェクトの属性

HttpRequestオブジェクトの属性を以下に記します。 ご紹介する属性はよく使われるものばかりであり、Webアプリケーション作成で必須の知識となるものばかりです。

HttpRequest.path

HttpRequestオブジェクトの属性pathを使用することで、リクエストされたドメインを含めないパスを返します。

def index(request):
    print(request.path)
    # /python/

HttpRequest.method

HttpRequestオブジェクトの属性methodを使用することで、リクエストに使用されたHTTPプロトコルのメソッドを返します。

つまりデータ送信にGETメソッドとPOSTメソッドのどちらを使用したのかを判別することができます。

ビューでは次のようにmethodを使用します。

def index(request):
if request.method == "POST":
        # POST時の操作を記入
    elif request.method == "GET":
        # GET時の操作を記入

HttpRequest.GET / POST

HttpRequestオブジェクトの属性GETまたはPOSTを使用することで、リクエスト時に送られたデータを辞書型で取得できます。

例えばGETで次のように送られたデータはrequest.GETで次のように取得できます。

https://office54.net/python?id=54&type=5

def index(request):
    print(request.GET["id"])
    # 54

より詳しい属性GET/POSTの使い方については次の記事を参考にしてください。

HttpRequest.FILES

HttpRequestオブジェクトの属性FILESを使用することで、アップロードされたファイルを操作できます。

つまりフォーム画面からアップロードされたファイルを操作(サーバーにダウンロードなど)するために使われる属性です。

FILESは辞書型オブジェクトのようなもので、キーはinputタグのnameに対応しています。

<input type="file" class="file" name="file" required>

またformタグには必ずenctype="multipart/form-data"method="POST"が入っている必要があります。
これら指定がなかった場合、FILESは空になってしまいます。

<form class="" method="POST" enctype="multipart/form-data">

FILESには以下の属性が用意されています。

name

FILESに属性nameを使うことで、アップロードされたファイル名を取得することができます。

def index(request):
    if request.method == "POST":
        print(request.FILES['uploadfile'].name)
        # アップロードされたファイル名が表示される

size

FILESに属性sizeを使うことで、アップロードされたファイルのサイズ(バイト単位)を取得することができます。

def index(request):
    if request.method == "POST":
        print(request.FILES['uploadfile'].size)
        # アップロードされたファイルのサイズが表示される

HttpRequest.user

FILESに属性userを使うことで、ログインしているユーザーを取得することができます。
これはdjango.contrib.auth.models.Userオブジェクトです。

HttpRequest.userをそのまま使用するとユーザー名が取得できます。

from django.contrib.auth.models import User

def index(request):
    print(request.user)
    # ログインしているユーザー名が表示される

属性userにis_authenticatedを使うことで、ログインしているかどうかを判別できます。

def index(request):
    if request.user.is_authenticated:
        # ログインしているときの処理
    else:
        # ログインしていないときの処理

またスーパーユーザーを判別するis_superuserなどもあります。

HttpRequest.COOKIES

HttpRequestオブジェクトの属性COOKIESを使用することで、Cookie(クッキー)の値を取得できます。

def index(request):
    request.COOKIES['key']
    # keyに対する値を取得

クッキーの値を取得する別の方法として、request.COOKIES.get('key')とする方法があります。

get()メソッドを使うことでkeyに値が保存されていない場合でもNoneとなりエラーが発生しません。

request.COOKIES['key']ではKeyErrorが発生してしまうため、get()メソッドを使うことをお勧めします。

まとめ

本記事「【Django】views.pyの引数resquest:HttpRequestオブジェクトの使用方法」はいかがでしたか。

views.pyで操作するHttpRequestオブジェクトは、Webアプリケーションにおいて重要な役割を担っています。

ぜひviews.pyでrequest(HttpRequestオブジェクト)を使いこなせるようになってください。