Djangoで403ページなどを自前のテンプレートに変更する方法

Djangoで403ページなどを自前のテンプレートに変更する方法をご紹介します。

条件

  • Django 2.1.4
  • Python 3.7.0

デフォルトのエラーページ

ここは、以下のエラーページについて対応します。

403 Forbidden アクセス権限がありません
404 Not Found 該当のページが見つかりません
500 Internal Server Error サーバー内部エラー

403エラー(Forbidden)

404エラー(Page Not Found)

500エラー(Page Not Found)

自前のエラーページ

自前のエラーページにするには、それぞれ以下のようにtemplatesフォルダにhtmlファイルをします。

myApp
 └templates
   ├ 403.html
   ├ 404.html
   └ 500.html

403エラー(Forbidden)

プロジェクト直下のtemplatesフォルダの下に「403.html」を追加します。

<!DOCTYPE html>
<html>
	<head>
	<meta charset="UTF-8" />
	</head>
	<body>
	<section>
    <div class="error403">
        <h1>403 Forbidden</h1>
    </div>
    <p>アクセス権限がありません。</p>
    {% if exception %}
    <p style="color: red">{{ exception }}</p>
    {% endif %}
	</section>
	<section>
	    <p><a href="javascript:history.back()">&lt; Back</a></p>
	</section>
	</body>
</html>

404エラー(Page Not Found)

プロジェクト直下のtemplatesフォルダの下に「404.html」を追加します。

<!DOCTYPE html>
<html>
	<head>
	<meta charset="UTF-8" />
	</head>
	<body>
	<section>
    <div class="error404">
        <h1>404 Page Not Found</h1>
        <p>リクエストされたURL {{ request.get_full_path }} は見つかりませんでした。</p>
    </div>
	</section>
	<section>
	    <p><a href="javascript:history.back()">&lt; Back</a></p>
	</section>
	</body>
</html>

500エラー(Internal Server Error)

プロジェクト直下のtemplatesフォルダの下に「500.html」を追加します。

<!DOCTYPE html>
<html>
	<head>
	<meta charset="UTF-8" />
	</head>
	<body>
	<section>
    <div class="error500">
        <h1>500 Internal Server Error</h1>
    </div>
    <p>サーバー内部エラーです。</p>
    {% if exception %}
    <p style="color: red">{{ exception }}</p>
    {% endif %}
	</section>
	<section>
	    <p><a href="javascript:history.back()">&lt; Back</a></p>
	</section>
	</body>
</html>

自前の404、500エラー確認

自前の404、500エラーを開発環境で確認する場合、以下の設定が必要です。

settings.py

# settings.py

DEBUG = False # Trueにするとデバッグ情報が入った404エラー画面が表示されます。
ALLOWED_HOSTS = ['127.0.0.1'] # DEBUG = Falseにした場合、適切なホスト情報を設定する必要があります。

404エラーを発生させる方法

存在しないURLにアクセスします。

500エラーを発生させる方法

以下ソースを追記し指定のURLにアクセスします。
(http://127.0.0.1:8000/test/)

# urls.py抜粋
urlpatterns = [

	・・・

    # 500エラー確認用
    path('test/', views.my_test_500_view, name='test'),
]
# views.py抜粋

from django.http import HttpResponseServerError

def my_test_500_view(request):
    # Return an "Internal Server Error" 500 response code.
    return HttpResponseServerError

動作結果

403エラー(Forbidden)

404エラー(Page Not Found)

500エラー(Page Not Found)

参考

Django公式:Error views

https://docs.djangoproject.com/ja/2.1/ref/views/#error-views

stackoverflow:How can I trigger a 500 error in Django?

https://stackoverflow.com/questions/24660406/how-can-i-trigger-a-500-error-in-django

stackoverrun:Django HTTP 500エラー

https://stackoverrun.com/ja/q/3988821

コメントを残す

メールアドレスが公開されることはありません。