web-dev-qa-db-ja.com

Django、カスタム500/404エラーページの作成

here が見つかったチュートリアルに従って、カスタム500または404エラーページを作成できません。間違ったURLを入力すると、ページにデフォルトのエラーページが表示されます。カスタムページが表示されないことを確認する必要があるものはありますか?

ファイルディレクトリ:

mysite/
    mysite/
        __init__.py
        __init__.pyc
        settings.py
        settings.pyc
        urls.py
        urls.pyc
        wsgi.py
        wsgi.pyc
    polls/
        templates/
            admin/
                base_site.html
            404.html
            500.html
            polls/
                detail.html
                index.html
        __init__.py
        __init__.pyc
        admin.py
        admin.pyc
        models.py
        models.pyc
        tests.py
        urls.py
        urls.pyc
        view.py
        views.pyc
    templates/
    manage.py

mysite/settings.py内で、これらを有効にしました:

DEBUG = False
TEMPLATE_DEBUG = DEBUG

#....

TEMPLATE_DIRS = (
    'C:/Users/Me/Django/mysite/templates', 
)

mysite/polls/urls.py内:

from Django.conf.urls import patterns, url

from polls import views

urlpatterns = patterns('',
    url(r'^$', views.index, name='index'),
    url(r'^(?P<poll_id>\d+)/$', views.detail, name='detail'),
    url(r'^(?P<poll_id>\d+)/results/$', views.results, name='results'),
    url(r'^(?P<poll_id>\d+)/vote/$', views.vote, name='vote'),
)

必要な他のコードを投稿できますが、間違ったURLを使用している場合、カスタム500エラーページを取得するにはどうすればよいですか?

編集

解決策:追加した

TEMPLATE_DIRS

私のsettings.py内でそれが問題を引き起こしていました

80
Zac

メインviews.pyの下に、次の2つのビューの独自のカスタム実装を追加し、テンプレート404.htmlおよび500.html表示したいもの。

このソリューションでは、urls.pyにカスタムコードを追加する必要はありません

コードは次のとおりです。

from Django.shortcuts import render_to_response
from Django.template import RequestContext


def handler404(request, *args, **argv):
    response = render_to_response('404.html', {},
                                  context_instance=RequestContext(request))
    response.status_code = 404
    return response


def handler500(request, *args, **argv):
    response = render_to_response('500.html', {},
                                  context_instance=RequestContext(request))
    response.status_code = 500
    return response

更新

handler404およびhandler500は、Django/conf/urls/__init__.pyにあるDjango文字列構成変数にエクスポートされます。それが上記の設定が機能する理由です。

上記の構成を機能させるには、urls.pyファイルで次の変数を定義し、エクスポートされたDjango変数がこれらのPython機能の文字列Djangoパスを指すようにする必要がありますビューは次のように定義されます:

# project/urls.py

handler404 = 'my_app.views.handler404'
handler500 = 'my_app.views.handler500'

Django 2.0の更新

Django 2.0でハンドラービューの署名が変更されました。 https://docs.djangoproject.com/en/2.0/ref/views/#error-views

上記のようにビューを使用すると、handler404は次のメッセージで失敗します。

「handler404()に予期しないキーワード引数 'exception'がありました」

そのような場合、次のようにビューを変更します。

def handler404(request, exception, template_name="404.html"):
    response = render_to_response("404.html")
    response.status_code = 404
    return response
100
Aaron Lelevier

公式の答え:

カスタムエラービューの設定方法に関する公式ドキュメントへのリンクは次のとおりです。

https://docs.djangoproject.com/en/stable/topics/http/views/#customizing-error-views

URLconfに次のような行を追加するように指示します(他の場所に設定しても効果はありません)。

handler404 = 'mysite.views.my_custom_page_not_found_view'
handler500 = 'mysite.views.my_custom_error_view'
handler403 = 'mysite.views.my_custom_permission_denied_view'
handler400 = 'mysite.views.my_custom_bad_request_view'

設定 CSRF_FAILURE_VIEW を変更して、CSRFエラービューをカスタマイズすることもできます。

デフォルトのエラーハンドラ:

デフォルトのエラーハンドラーのドキュメント、 page_not_foundserver_errorpermission_denied 、および bad_request を読む価値があります。デフォルトでは、404.html500.html403.html400.htmlの各テンプレートを見つけることができれば、これらのテンプレートを使用します。

そのため、きれいなエラーページを作成するだけで、TEMPLATE_DIRSディレクトリにそれらのファイルを作成するだけであれば、URLConfを編集する必要はまったくありません。ドキュメントを読んで、使用可能なコンテキスト変数を確認してください。

Django 1.10以降では、デフォルトのCSRFエラービューはテンプレート403_csrf.htmlを使用します。

落とし穴:

これらが機能するためには、DEBUGをFalseに設定する必要があることを忘れないでください。そうしないと、通常のデバッグハンドラーが使用されます。

53
Flimm

これらの行をurls.pyに追加します

urls.py

from Django.conf.urls import (
handler400, handler403, handler404, handler500
)

handler400 = 'my_app.views.bad_request'
handler403 = 'my_app.views.permission_denied'
handler404 = 'my_app.views.page_not_found'
handler500 = 'my_app.views.server_error'

# ...

そして、views.pyにカスタムビューを実装します。

views.py

from Django.shortcuts import (
render_to_response
)
from Django.template import RequestContext

# HTTP Error 400
def bad_request(request):
    response = render_to_response(
        '400.html',
        context_instance=RequestContext(request)
        )

        response.status_code = 400

        return response

# ...
33
Armance

参照したページから:

ビュー内からHttp404を発生させると、Djangoは404エラーの処理専用の特別なビューをロードします。ルートURLconfで変数handler404を検索することで(およびルートURLconfでのみ;それ以外の場所にhandler404を設定しても効果はありません)、Python点線構文の文字列です。通常のURLconfコールバックが使用します。 404ビュー自体には特別なものはありません。通常のビューです。

したがって、urls.pyに次のようなものを追加する必要があると思います。

handler404 = 'views.my_404_view'

そしてhandler500についても同様です。

19
Mike Pelley

DEBUG = Falseのときにサイトに派手なエラーメッセージがあるカスタムページを表示するだけでよい場合、404.htmlおよび500.htmlという2つのテンプレートをテンプレートディレクトリに追加すると、このカスタムページが自動的に取得されます。 404または500が発生したとき。

18
Krishna G Nair

Django 2の場合は、次の手順に従ってください。

project/settings.pyファイルを次のように編集します。

DEBUG = False
ALLOWED_HOSTS = ['127.0.0.1','localhost']

これをviews.pyに追加します:

def error_404_view(request, exception):
    return render(request,'myapp/404.html')

カスタム404.htmlファイルを作成します。

プロジェクトのurls.pyファイルに移動し、urlpatternsの後に次の行を追加します。

handler404 = 'myapp.views.error_404_view'

ブラウザにアクセスして存在しないURLを開くと、カスタム404エラーページが表示されます。

14
Alex Jolig

settings.py ::::

DEBUG = False
TEMPLATE_DEBUG = DEBUG
ALLOWED_HOSTS = ['localhost']  #provide your Host name

テンプレートフォルダーに404.htmlおよび500.htmlページを追加するだけです。投票アプリのテンプレートから404.htmlと500.htmlを削除します。

9
Rakesh babu

Django 2。*では、この構成をviews.pyで使用できます

def handler404(request, exception):
    return render(request, 'errors/404.html', locals())

settings.py

DEBUG = False

if DEBUG is False:
    ALLOWED_HOSTS = [
        '127.0.0.1:8000',
        '*',
    ]

if DEBUG is True:
    ALLOWED_HOSTS = []

rls.py

# https://docs.djangoproject.com/en/2.0/topics/http/views/#customizing-error-views
handler404 = 'YOUR_APP_NAME.views.handler404'

通常、私はdefault_appを作成し、サイト全体のエラー、コンテキストプロセッサを処理します。

8
DeN

エラーを作成します、エラーページで、Djangoがテンプレートをロードしている場所を見つけます。パススタックを意味します。ベースtemplate_dirこれらのhtmlページを追加します500.html404.html 。これらのエラーが発生すると、それぞれのテンプレートファイルが自動的にロードされます。

44など、他のエラーコードのページも追加できます。

この助けを願っています!!!

7
allsyed

1行として(404汎用ページ用):

from Django.shortcuts import render_to_response
from Django.template import RequestContext

return render_to_response('error/404.html', {'exception': ex},
                                      context_instance=RequestContext(request), status=404)
5
FireZenk
# views.py
def handler404(request, exception):
    context = RequestContext(request)
    err_code = 404
    response = render_to_response('404.html', {"code":err_code}, context)
    response.status_code = 404
    return response

# <project_folder>.urls.py
handler404 = 'todo.views.handler404' 

これはDjango 2.0で動作します

必ずカスタム404.htmlをアプリテンプレートフォルダー内に含めてください。

エラーテンプレートを.../Django/mysite/templates/に移動してみてください?

これについてはわかりませんが、これらはウェブサイトに対して「グローバル」である必要があると思います。

3
astrognocci