Django#2 ~views.pyとurl.pyでHTTPレスポンスの仕組みをしる~
スポンサーリンク

Viewsとは?

動的なウェブサイトではユーザーからのリクエストを受け取り、データベースと連携しながらウェブページを表示する必要があります。

Djangoではこの機能を「View」を使って実現します。

「View」はHTTPリクエストとHTTPレスポンスを管理する関数です。

静的なウェブサイトではクライアントからHTTPリクエストでURLが指定されたら、URLに対応するHTMLなどのファイルをHTTPレスポンスで返します。

以下にブラウザにh1タグで文字を表示するviewを作成します。

# views.py
from django.shortcuts import render
from django.http import HttpResponse

# Create your views here.
# homeディレクトリのHTTPレスポンスを作成
def home(request):
    content = "<h1>Welcome to Django!</h1>"
    return HttpResponse(content)

ルーティングとは?

Viewを設定しただけではブラウザに表示するには不十分です。

URLとViewをマッピングすることで、特定のURLに対してView関数を実行することができます。

urls.pyはプロジェクトフォルダに存在していますが、appフォルダのviews.pyと同じ階層に作成してルーティングをすることが可能です。

appにurls.pyを作成しviews.pyとつなぐ

appフォルダ内でviews.pyと同じ階層にurls.pyを作成します。

Projectフォルダとappフォルダ内にそれぞれurls.pyがある状態です。

app内のurls.pyに以下の設定をします。

ここではviews.pyのhomeをルーティングしています。

# urls.py(app)
from django.urls import path
from . import views

urlpatterns = [
    path("", views.home),
]

appにurls.pyを作成しviews.pyとつなぐ

つづいてProjectとappのurls.pyをつなぐ設定をします。

Projectのurls.pyにinclude関数を用いてルーティングをします。

# urls.py(project)コード

from django.contrib import admin
# 1.inclueをインポート
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    # 2.アプリ名とurlsでappのurlsをマッピング
    path('', include('myapp1.urls')),
]

views.pyでHTTPリクエストのヘッダー情報を取得できる

DjangoではHTTPリクエストのヘッダーの内容を取得することや、レスポンスに値を含むことができます。

以下にサンプルコードを記述します。

# views.pyコード

def home(request):
    path = request.path
    scheme = request.scheme
    method = request.method
    address = request.META['REMOTE_ADDR']
    user_agent = request.META['HTTP_USER_AGENT']
    user_platform = request.META['HTTP_SEC_CH_UA_PLATFORM']
    user_cookie = request.META['HTTP_COOKIE']
    path_info = request.path_info

  #↓レスポンスの情報を取得したり追加することも可能
    response = HttpResponse()
    response.headers['Age'] = 20

    msg = f"""<br>
          <br>Path: {path}
          <br>Scheme: {scheme}
          <br>Address: {address}
          <br>Method: {method}
          <br>User_agent: {user_agent}
          <br>User_platform: {user_platform}
          <br>Path_info: {path_info}
          <br>Cookie: {user_cookie}
          <br>Response_headers: {response.headers}
    """

    return HttpResponse(msg, content_type='text/html', charset='utf-8')

URLに変数を含める

views.pyとurls.pyで変数を定めてURLに変数を含めることができます。

以下の様にURLに入力した値が変数に代入されます。

# views.py

from django.shortcuts import render
from django.http import HttpResponse, HttpResponseNotFound

# Create your views here.

def usernames(request, username):
    return HttpResponse(f"<h1>{username}</h1>", content_type='text/html', charset='utf-8')
# urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('<str:username>', views.usernames, name='names'),
]

正規表現(regular expression)

URLの指定には正規表現という書き方もあります。

文字列の検索など高度な検索を実現するようですが、まだあまり有効性を理解していません、、、

正規表現は便利ですが解読が難しいというデメリットがあります。

from django.shortcuts import render
from django.http import HttpResponse

# Create your views here.
def home(reuqest, id):
    return HttpResponse(f"<h1>{id}</h1>")
from django.urls import path, re_path
from . import views

urlpatterns = [
    # {4} → 4桁の数字を代入することができる
    re_path(r'^([0-9]{4})$', views.home, name="home"),
]

HTTPエラーメッセージ

DEBUGモードエラー画面の設定変更

Djangoではデフォルトで以下の様な画面がエラー画面が表示されます。

これはsettings.pyでDEBUGのステータスがTrueになっていると表示される画面で、開発者用にエラー内容が詳細に記載されています。

settings.pyの設定を以下の様に変更することでエラー画面が通常表示されるものへ変更されます。

<変更前>

#settings.py の 中身
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = []

<変更後>

#settings.py の 中身
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False # デバッグモードをオフにする

ALLOWED_HOSTS = ['*'] # すべてのホストを有効にする

404画面の表示内容を変更

上記デバッグ画面を変更したら、404画面を独自に設定したいと思います。

作業はすべてプロジェクトレベル階層での処理になります。

プロジェクトフォルダにviews.pyを作成

handler404の関数をプロジェクトフォルダにviews.pyを作成して設定します。

<プロジェクトフォルダのviews.py>

from django.http import HttpResponse

# Create your views here.
def handler404(request, exception):
    return HttpResponse("<h1>404</h1><p>お探しのページは見つかりませんでした</p>")

プロジェクトフォルダのurls.pyに以下を設定し、404ページが表示されるときのマッピングをします。

<プロジェクトフォルダのurls.py>

handler404 = "myproject.views.handler404"

設定がうまくいくと以下の様に表示されます。

ぜひ参考にしてください!また!

Twitterでフォローしよう

おすすめの記事