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内でそれが問題を引き起こしていました
メイン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
カスタムエラービューの設定方法に関する公式ドキュメントへのリンクは次のとおりです。
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_found
、 server_error
、 permission_denied
、および bad_request
を読む価値があります。デフォルトでは、404.html
、500.html
、403.html
、400.html
の各テンプレートを見つけることができれば、これらのテンプレートを使用します。
そのため、きれいなエラーページを作成するだけで、TEMPLATE_DIRS
ディレクトリにそれらのファイルを作成するだけであれば、URLConfを編集する必要はまったくありません。ドキュメントを読んで、使用可能なコンテキスト変数を確認してください。
Django 1.10以降では、デフォルトのCSRFエラービューはテンプレート403_csrf.html
を使用します。
これらが機能するためには、DEBUG
をFalseに設定する必要があることを忘れないでください。そうしないと、通常のデバッグハンドラーが使用されます。
これらの行を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にカスタムビューを実装します。
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
# ...
参照したページから:
ビュー内からHttp404を発生させると、Djangoは404エラーの処理専用の特別なビューをロードします。ルートURLconfで変数handler404を検索することで(およびルートURLconfでのみ;それ以外の場所にhandler404を設定しても効果はありません)、Python点線構文の文字列です。通常のURLconfコールバックが使用します。 404ビュー自体には特別なものはありません。通常のビューです。
したがって、urls.pyに次のようなものを追加する必要があると思います。
handler404 = 'views.my_404_view'
そしてhandler500についても同様です。
DEBUG = False
のときにサイトに派手なエラーメッセージがあるカスタムページを表示するだけでよい場合、404.htmlおよび500.htmlという2つのテンプレートをテンプレートディレクトリに追加すると、このカスタムページが自動的に取得されます。 404または500が発生したとき。
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エラーページが表示されます。
settings.py ::::
DEBUG = False
TEMPLATE_DEBUG = DEBUG
ALLOWED_HOSTS = ['localhost'] #provide your Host name
テンプレートフォルダーに404.htmlおよび500.htmlページを追加するだけです。投票アプリのテンプレートから404.htmlと500.htmlを削除します。
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を作成し、サイト全体のエラー、コンテキストプロセッサを処理します。
エラーを作成します、エラーページで、Djangoがテンプレートをロードしている場所を見つけます。パススタックを意味します。ベースtemplate_dirこれらのhtmlページを追加します500.html、404.html 。これらのエラーが発生すると、それぞれのテンプレートファイルが自動的にロードされます。
4や4など、他のエラーコードのページも追加できます。
この助けを願っています!!!
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)
# 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/
に移動してみてください?
これについてはわかりませんが、これらはウェブサイトに対して「グローバル」である必要があると思います。