Help us understand the problem. What is going on with this article?

Djangoのデフォルトエラーページが DEBUG=Falseだと見れないのはなんでか調べた

More than 1 year has passed since last update.

はじめに

この調査記事は Django2.1.4 を 2019/01/04 時点で調べてみたときのメモです。

流れ

$ django-admin startproject mysite
$ python mysite/manage.py runserver

した際に、 http://127.0.0.1:8000/ を見ると出てくるこのページ

image.png

が、 mysite/settings.pyDEBUG = True ではなく、 DEBUG = False にしたら表示されなくなったということで、調べてみた。

まずは

CommandError: You must set settings.ALLOWED_HOSTS if DEBUG is False.

が出るので、とりあえず

settings.py
ALLOWED_HOSTS = ['127.0.0.1']

を追加しておく。

すると

image.png

となってしまう。

ではこのスタートページは一体?

https://github.com/django/django/blob/master/django/views/templates/default_urlconf.html

このファイルがテンプレートして呼び出されているようだ。

どうやら debug.py が呼ばれている様子。

https://github.com/django/django/blob/82f286cf6f198d37850d3c5df637b5665566a66b/django/views/debug.py#L474

debug.py
# technical_404_response
     else:

         if (not tried or (                  # empty URLconf 
             request.path == '/' and
             len(tried) == 1 and             # default URLconf
             len(tried[0]) == 1 and
             getattr(tried[0][0], 'app_name', '') == getattr(tried[0][0], 'namespace', '') == 'admin'
         )):
             return default_urlconf(request)

ということなので、要するに特定の条件の404(要はhttps://127.0.0.1:8000/ のような呼び出し)であればこのページを出している、ということだった。

確かにこれ以外の404は DEBUG = True であれば

image.png

こんな感じになる。

もう少し追ってみると

https://github.com/django/django/blob/master/django/core/handlers/exception.py#L41-L46

exception.py
def response_for_exception(request, exc):
    if isinstance(exc, Http404):
        if settings.DEBUG:
            response = debug.technical_404_response(request, exc)
        else:
            response = get_exception_response(request, get_resolver(get_urlconf()), 404, exc)

確かに DEBUG = True のときだけこのページが利用されていることがわかりました!

mysite/urls.py
 urlpatterns = [
      path('', ここになにか),
      path('admin/', admin.site.urls),
 ]

って書くことでうまいことやるか、テンプレートをおいたりビューを定義すれば良さそうですね。

because DEBUG=True is in your settings file and you have not configured any URLs

って書いてあるとおりだったというわけか。なるほど。

tetsunosukeito
人事部門に所属し、エンジニア採用とまなびプランナーとして全社育成制度の設計をしています。ゲームを用いた研修や体を使ったアクティビティ、レゴや写真を活用した対話のワークショップを得意としています。 株式会社フォトクリエイト / 株式会社CCCフォトライフラボ / 株式会社しまうまプリント / 株式会社キタムラ・ホールディングス
https://note.com/tetsunosuke
photocreate
ITの力で、写真を通じて感動があふれかえる社会を実現する「フォトライフ構想」を目指すWebサービスを展開しています
https://www.photocreate.co.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした