DjangoテンプレートでURLやユーザーの取得|request

Django

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

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

「テンプレート上でURLやユーザー情報を取得する方法ってどうやるの?」

「そもそも、requestの仕組みってどうなってるの?」

「初心者だから実例もあると助かるんだけど、、、」

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

  • DjangoテンプレートでURLやユーザーの取得|request
  • requestって何?その仕組みについて知っておこう
  • 【実例】日報アプリで使ってみた

【著者プロフィール】

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

当ブログを通じて、下記アプリの作り方、コード等を公開、解説しています

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

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

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

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

初期費用ゼロ/月9,800円でWebデザインが学べる

デザインを習得するためには、客観的なフィードバックと改善が不可欠です。

以下の記事ではこんなWebデザインスクールをご紹介しています。

  • 初期費用ゼロで、月々9,800円のみ
  • オンラインで、教材が使い放題
  • コンテストや実務案件にチャレンジして報酬もGETできる

デザナルはトップデザイナーからレビューがもらえる、格安のWebデザインスクールです。

>>デザナルに興味がある方はこちらからどうぞ<<

詳細をまとめた記事もございますので、ぜひご覧ください。

DjangoテンプレートでURLやユーザーの取得|request

{{ request }} を使って、①URLを取得する方法②ユーザー情報を取得する方法をそれぞれ見ていきます。

URLの取得方法

【ドメインのみ】

{{ request.get_host }}

#ブラウザで表示されるのは→ nippo.itc-app.site

【http(s)】

{{ request.scheme }}

#ブラウザで表示されるのは→ https

【パス(パラメータ無し)】

{{ request.path }}

#ブラウザで表示されるのは→ /app/

【パス(パラメータ有り)】

{{ request.get_full_path }}

#ブラウザで表示されるのは→ /app/?search=ブログ

【URL】

{{ request.build_absolute_uri }}

#ブラウザで表示されるのは→ https://nippo.itc-app.site/app/?search=ブログ

ユーザー情報の取得方法

【ユーザーオブジェクトの取得】

{{ request.user }}

#ブラウザで表示されるのは→ admin@itc.tokyo

※ログイン方法をメールアドレスによる方法へ変更しています。

【ユーザーがログインしているかどうか】

{{ request.user.is_authenticated }}

#ブラウザで表示されるのは→ True(ログインしている場合)

【ユーザーがログアウトしているかどうか】

{{ request.user.is_anonymous }}

#ブラウザで表示されるのは→ False(ログインしている場合)

【ユーザーが管理者かどうか】

{{ request.user.is_admin }}

#ブラウザで表示されるのは→ True(管理者の場合)

上手く動作しないときは設定を確認

settings.pyで、TEMPLATES > OPTIONS > context_processorsが下記の通りになっているかを確認しましょう。

TEMPLATES = [
    ...
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.request',
            ],
        },
    ...
]

以上がrequestを使って、URLやユーザー情報を取得する方法です。

ただ、そもそもこの「request」って何でしょうか?

すごい詳しく知る必要はないかもしれませんが、概要だけ知っておけば今後の役にも立つはずです。

次章で簡単にご説明します。

requestって何?その仕組みについて知っておこう

Djangoでは「request」を使う場面がたくさん出てきます。

おまじないのように使ってはいるものの、「なんだかよくわからない」という人も多いのではないのでしょうか?

そんな「request」理解頂く為に、当章では下記の解説をしてきます。

  1. ウェブサービス全体における「HTTPリクエスト」「HTTPレスポンス」の概要を把握
  2. Djangoではそれらがどのように扱われているのか

詳しく説明をすることはしません。

あくまでもWebアプリを作成していくという観点で最低限知っておきたいことをまとめました。

5分程度でザッとお読みいただく程度で構いません。

HTTPリクエストとレスポンス

インターネットを使用する上で、常に「HTTPリクエスト」と「HTTPレスポンス」が行き来しています。

アドレスバーにURLを打ち込み、ページを表示させるという例では、

  • アドレスバーにURLを打ち込むことを、「HTTPリクエスト
  • ページがブラウザ上に表示されることを、「HTTPレスポンス

と言います。

つまり、あなたがブラウザで行う動作(URLを打ち込むこと、リンクをクリックすることなど)はWebサーバーに対する注文、リクエストです。

その注文に対して、Webサーバーが適切なサービスを届けること(ブラウザでページを表示する、メールを送信する、など)が、レスポンスと言えます。

常に、「HTTPリクエスト」に対して「HTTPレスポンス」が返されることで我々はインターネットを使うことができています。

※「もっと詳しく知りたい!」という方はこちらの記事をどうぞ→「Webサーバーとは?リクエスト、レスポンスって何?」

Djangoにおける「request」とは?

さて、前置きが長くなりました。

結論から申しますと、Djangoにおける「request」とは、HTTPリクエストです。

Djangoアプリ上で、みなさんが行う動作はHTTPリクエストとしてWebサーバーに送られます。

その際Djangoでは、独自のPythonクラス「HttpRequest」を使って送信元であるあなたの情報をまとめ上げてリクエストを行っています。

英語ではありますが公式サイトでより詳しく説明されています → 【公式サイト】HttpRequestについて

「まとめあげる」というのは、Djangoの「request」は、単にURLを送信、フォームで入力した値を送信するのだけではなく、ユーザーのログイン情報どのURLから送信しているか、など様々な情報をセットにして一緒に送っているということです。

そのため、{{ request.user }} {{ request.path }}などとすることでその格納されているデータにアクセスすることが可能になります。

参考までにプロパティ・属性一覧は下記の通りです。

['COOKIES', 'FILES', 'GET', 'META', 'POST', 'class', 'delattr', 'dict', 'dir', 'doc', 'eq', 'format', 'ge', 'getattribute', 'gt', 'hash', 'init', 'init_subclass', 'iter', 'le', 'lt', 'module', 'ne', 'new', 'reduce', 'reduce_ex', 'repr', 'setattr', 'sizeof', 'str', 'subclasshook', 'weakref', '_current_scheme_host', '_encoding', '_get_full_path', '_get_post', '_get_raw_host', '_get_scheme', '_initialize_handlers', '_load_post_and_files', '_mark_post_parse_error', '_messages', '_read_started', '_set_content_type_params', '_set_post', '_stream', '_upload_handlers', 'accepted_types', 'accepts', 'body', 'build_absolute_uri', 'close', 'content_params', 'content_type', 'csrf_processing_done', 'encoding', 'environ', 'get_full_path', 'get_full_path_info', 'get_host', 'get_port', 'get_raw_uri', 'get_signed_cookie', 'headers', 'is_ajax', 'is_secure', 'method', 'parse_file_upload', 'path', 'path_info', 'read', 'readline', 'readlines', 'resolver_match', 'scheme', 'session', 'upload_handlers', 'user']

以上、簡単なご説明ではありますが、これが「request」の正体です。

より詳しく掘り下げたいという方は、公式サイトもご覧頂くとより理解が深まります。

ただし、知らないとWebアプリが作れないわけではありませんので、これ以上の深堀りは絶対ではありません。気にせず先に進んでもOKです。

Request and response objects | Django documentation | Django

【実例】日報アプリで使ってみた

さて、当ブログで一からの作成を解説している日報アプリでは下記のように{{ request }} を使っていきます。

今までの内容を少し応用し、

  • メソッド「is_authenticated」
  • if文内でrequest.user

を使っています。

【nippo-list.html】

一覧ページでは、どのユーザーが作成した日報かがわかるようにしています。

{% extends "base.html" %}

{% block content %}
<div class="container">
    {% if request.user.is_authenticated %}
        <div class="mt-3 d-flex justify-content-end">
            <a href={% url "nippo-create" %} class="btn btn-outline-primary float-right">
                <svg xmlns="http://www.w3.org/2000/svg" width="30" height="30" fill="currentColor" class="bi bi-plus" viewBox="0 0 16 16">
                    <path d="M8 4a.5.5 0 0 1 .5.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3A.5.5 0 0 1 8 4z"/>
                </svg>
            </a>
        </div>
    {% endif %}
        {% for obj in object_list %}
            <div class="card my-3">
                <div class="card-body">
                    <h5 class="card-title">
                        <a href={% url 'nippo-detail' obj.pk %}>
                            {{ obj.title}}
                        </a>
                    </h5>
                    <p class="card-text">
                        {{ obj.content }}
                    </p>
                    {% if obj.user == request.user %}
                    <a href={% url 'nippo-update' obj.pk %} class="btn btn-primary btn-sm">
                        編集
                    </a>
                    {% endif %}
                </div>
            </div>
        {% endfor %}              
</div>
{% endblock %}

【結果】

【nippo-detail.html】

詳細ページでは、自分の日報のみ編集、削除ができるように条件分岐を使っています。

{% extends 'base.html' %}

{% block content %}
<div class="container">
    <div class="card mx-auto my-5 w-50" style="min-width:300px;">
        <div class="card-header">
            {{ object.timestamp }}
        </div>
        <div class="card-body">
            <h3 class="card-title">{{ object.title }} </h3>
            <p class="card-text">{{ object.content }}</p>
            {% if object.user == request.user %}
            <div class="w-50">
                <a href={% url 'nippo-update' object.pk %} class="btn btn-primary btn-sm">編集</a>
                <button type="button" class="btn btn-danger btn-sm" data-bs-toggle="modal" data-bs-target="#deleteModal">
                        削除
                </button>
                {% include 'nippo/nippo-delete.html' %}
            </div>
            {% endif %}
        </div>
    </div> 
</div>
{% endblock %}

✓別のユーザーでアクセスした場合

編集、削除ができない仕様になっています。

✓日報の作成者がアクセスした場合

編集や削除が自由にできるようになります。

まとめ

当記事の内容をまとめていきます。

Djangoアプリ上でrequestを使い、URLを取得する方法は下記のとおりです。

  • {{ request.get_host }}
  • {{ request.scheme }}
  • {{ request.path }}
  • {{ request.get_full_path }}
  • {{ request.build_absolute_uri }}

Djangoアプリ上でrequestを使い、ユーザー情報を取得する方法は下記のとおりです。

  • {{ request.user }}
  • {{ request.user.is_authenticated }}
  • {{ request.user.is_anonymous }}
  • {{ request.user.is_admin }}

HttpRequestオブジェクトとして、様々な情報がまとまっている「request」を使うことでテンプレート上でURLやユーザー情報が取得できました。

ただし、今回ご説明した実例について、「見てもよく分からない!」という方もいらっしゃるかもしれません。

そんな方は是非、一からWebアプリを作成している記事が載っていますので、下記を参考に是非一緒にDjangoの学習を始めましょう。

当ブログでは、日報アプリ開発を通じて、Webアプリを一から開発し公開するまでを初学者の方でもわかるようにと記事を連載しています

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

という方は必見です!

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