在完全找到here教程后,我无法创建自定义500或404错误页面。如果我输入了错误的网址,该页面会为我提供默认的错误页面。有什么我应该检查,以防止自定义页面显示?
档案目录:
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'),
)
我可以发布任何其他必要的代码,但是如果我使用了错误的网址,我应该如何更改以获取自定义500错误页面?
修改
解: 我有一个额外的
TEMPLATE_DIRS
在我的settings.py中,这导致了问题
答案 0 :(得分:96)
在您的主views.py
下添加您自己的以下两种视图的自定义实现,只需设置模板 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变量指向定义这些Django功能视图的字符串Python路径,如下所示:
# 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
答案 1 :(得分:48)
以下是有关如何设置自定义错误视图的官方文档的链接:
https://docs.djangoproject.com/en/stable/topics/http/views/#customizing-error-views
它说要在你的URLconf中添加这样的行(在其他任何地方设置它们都没有效果):
404.html
您还可以通过修改设置CSRF_FAILURE_VIEW
来自定义CSRF错误视图。
值得阅读默认错误处理程序的文档page_not_found
,server_error
,permission_denied
和bad_request
。默认情况下,他们会分别使用这些模板:500.html
,403.html
,400.html
和TEMPLATE_DIRS
。
因此,如果您只想制作漂亮的错误页面,只需在403_csrf.html
目录中创建这些文件,您根本不需要编辑URLConf。阅读文档以了解哪些上下文变量可用。
在Django 1.10及更高版本中,默认的CSRF错误视图使用模板DEBUG
。
不要忘记datatables
必须设置为False才能使这些工作正常,否则,将使用正常的调试处理程序。
答案 2 :(得分:32)
在urls.py中添加这些行
Application.Invoke
并在views.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'
# ...
答案 3 :(得分:19)
从您引用的页面:
当您从视图中提升Http404时,Django将加载一个专门用于处理404错误的特殊视图。它通过在根URLconf中查找变量handler404来找到它(并且只在你的根URLconf中;在其他任何地方设置handler404都没有效果),这是Python点缀语法中的字符串 - 与普通URLconf回调使用的格式相同。 404视图本身并没有什么特别之处:它只是一个普通视图。
所以我相信你需要在你的urls.py中添加这样的东西:
handler404 = 'views.my_404_view'
和handler500类似。
答案 4 :(得分:18)
如果你需要的只是在DEBUG = False
显示自己网站上有一些奇特的错误消息的自定义页面,那么在你的模板目录中添加两个名为404.html和500.html的模板,它会自动提取提出404或500时的自定义页面。
答案 5 :(得分:12)
对于 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'
现在,如果您转到浏览器并打开任何不存在的网址,系统会显示自定义404错误页面。
答案 6 :(得分:10)
Django 3.0
这是link如何自定义错误视图
这里link是如何呈现视图
在urls.py
(主要文件夹在项目文件夹中)中,放置:
handler404 = 'my_app_name.views.custom_page_not_found_view'
handler500 = 'my_app_name.views.custom_error_view'
handler403 = 'my_app_name.views.custom_permission_denied_view'
handler400 = 'my_app_name.views.custom_bad_request_view'
,然后在该应用(my_app_name
)中放入views.py
:
def custom_page_not_found_view(request, exception):
return render(request, "errors/404.html", {})
def custom_error_view(request, exception=None):
return render(request, "errors/500.html", {})
def custom_permission_denied_view(request, exception=None):
return render(request, "errors/403.html", {})
def custom_bad_request_view(request, exception=None):
return render(request, "errors/400.html", {})
注意:error/404.html
是将文件放置到项目(而不是应用程序)模板文件夹中的路径templates/errors/404.html
,因此,请将文件放置在所需的位置并编写正确的路径。
注2:页面重新加载后,如果仍然看到旧模板,请更改settings.py
DEBUG=True
,保存,然后再次更改为False
(重新启动服务器并收集新文件)。
答案 7 :(得分:9)
settings.py ::::
DEBUG = False
TEMPLATE_DEBUG = DEBUG
ALLOWED_HOSTS = ['localhost'] #provide your host name
只需在模板文件夹中添加404.html和500.html页面即可。 从民意调查应用中的模板中移除404.html和500.html。
答案 8 :(得分:9)
在Django 3.x
中,接受的答案将不起作用,因为render_to_response
已被完全删除,并且自接受答案的版本以来,还进行了一些更改。
还有其他一些答案,但是我要给出一个更简洁的答案:
在主urls.py
文件中:
handler404 = 'yourapp.views.handler404'
handler500 = 'yourapp.views.handler500'
在yourapp/views.py
文件中:
def handler404(request, exception):
context = {}
response = render(request, "pages/errors/404.html", context=context)
response.status_code = 404
return response
def handler500(request):
context = {}
response = render(request, "pages/errors/500.html", context=context)
response.status_code = 500
return response
确保已将render()
文件导入yourapp/views.py
:
from django.shortcuts import render
旁注:render_to_response()
在Django 2.x
中已弃用,并且在版本3.x
中已被完全删除。
答案 9 :(得分:7)
发生错误,在错误页面上找出django加载模板的位置。我的意思是路径堆栈。在基础 template_dir 中添加这些html页面 500.html < / em> , 404.html 。发生这些错误时,将自动加载相应的模板文件。
您也可以为其他错误代码添加页面,例如 400 和 403 。
希望这有帮助!!!
答案 10 :(得分:7)
在 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 = []
在 urls.py
中# https://docs.djangoproject.com/en/2.0/topics/http/views/#customizing-error-views
handler404 = 'YOUR_APP_NAME.views.handler404'
通常我会创建 default_app 并处理网站范围内的错误,其中包含上下文处理器。
答案 11 :(得分:7)
不需要其他视图。 https://docs.djangoproject.com/en/3.0/ref/views/
只需将错误文件放在模板目录的根目录中
当debug为False时,它应该使用您的错误页面
答案 12 :(得分:5)
作为一行(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)
答案 13 :(得分:4)
# 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
包含在应用程序模板文件夹中。
答案 14 :(得分:3)
尝试将错误模板移至.../Django/mysite/templates/
?
我不确定这个,但我认为这些必须是网站的“全球”。