(最終更新月:2022年12月)
✔このような方へ向けて書かれた記事となります
「テンプレート上でURLやユーザー情報を取得する方法ってどうやるの?」
「そもそも、requestの仕組みってどうなってるの?」
「初心者だから実例もあると助かるんだけど、、、」
✔当記事を通じてお伝えすること
- DjangoテンプレートでURLやユーザーの取得|request
- requestって何?その仕組みについて知っておこう
- 【実例】日報アプリで使ってみた
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」を理解頂く為に、当章では下記の解説をしてきます。
- ウェブサービス全体における「HTTPリクエスト」「HTTPレスポンス」の概要を把握
- 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 }} を使っていきます。
今までの内容を少し応用し、
- メソッド「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の学習を始めましょう。