Django,创建一个自定义500/404错误页面

按照教程中找到的 给你,我不能创建一个自定义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/setings.py 中,我启用了以下功能:

DEBUG = False
TEMPLATE_DEBUG = DEBUG


#....


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

在 mysite/poll/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

在我的设置之内。 py,这就是问题所在

237732 次浏览

从你提到的页面:

当从视图中引发 Http404时,Django 将加载一个专门处理404错误的特殊视图。它通过在根 URLconf 中查找变量 handler404(并且只在根 URLconf 中查找; 在其他任何地方设置 handler404都没有效果)来找到它,这是 Python 虚线语法中的一个字符串——与普通 URLconf 回调使用的格式相同。404视图本身没有什么特别之处: 它只是一个普通视图。

因此,我认为您需要在 urls.py 中添加类似的内容:

handler404 = 'views.my_404_view'

和类似的处理器500。

尝试将错误模板移动到 .../Django/mysite/templates/

我注意到这一点,但我认为这些需要是“全球”的网站。

在您的主 views.py下面添加您自己的以下两个视图的自定义实现,并只设置模板 404. html500. 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

更新

handler404handler500导出了 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()得到了一个意外的关键字参数’异常’”

在这种情况下,像下面这样修改您的视图:

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

作为一个单行(对于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)

在 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 中实现我们的自定义视图。

视野,视野

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


# ...

设置:

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

然后在模板文件夹中添加 404.html500.html页面。 从投票应用程序的模板中删除 404.html500.html

官方回答:

下面是关于如何设置自定义错误视图的官方文档链接:

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_errorserver_error0和 server_error1的文档。默认情况下,如果能够分别找到这些模板,则使用它们: 404.html500.html403.html400.html

因此,如果您想要做的只是创建漂亮的错误页面,那么只需在 TEMPLATE_DIRS目录中创建这些文件,根本不需要编辑 URLConf。阅读文档,看看哪些上下文变量是可用的。

在 Django 1.10及更高版本中,默认的 CSRF 错误视图使用模板 403_csrf.html

抓到你了:

不要忘记,DEBUG必须设置为 False 才能正常工作,否则,将使用普通的调试处理程序。

在错误页面上找出 django 加载模板的位置。我指的是路径堆栈。当出现这些错误时,将自动加载相应的模板文件。

您也可以为其他错误代码添加页面,如 400403

希望这个帮助! ! !

如果所有你需要的是显示自定义页面,有一些奇特的错误消息为您的网站时,DEBUG = False,然后添加两个模板命名为404.html 和500.html 在您的模板目录,它会自动拾取这个自定义页面时,一个404或500被引发。

姜戈2中,你可以在 视野,视野中使用这个结构

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

设置

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'

通常我创建的 < em > default _ app 和处理站点范围的错误,上下文处理器在其中。

# 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 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

确保在 yourapp/views.py文件中导入了 render():

from django.shortcuts import render

旁注: render_to_response()在 Django 2.x中已被弃用,在版本 3.x中已被完全删除。

Django 3.0 + 4.0 +

下面是 链接如何自定义错误视图

这里是 链接如何呈现一个视图

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", {})

注意: errors/404.html是路径,如果你把你的文件到项目(而不是应用程序)模板文件夹 templates/errors/404.html,所以请把你想要的文件和写正确的路径。

注意2: 重新加载页面后,如果仍然看到旧模板,请在 settings.py DEBUG=True中更改,保存它,然后再次保存到 False并再次保存(这将重新启动服务器并收集新文件)。

不需要其他视图

只需将错误文件放在 template 目录的根目录中

  • 404. html
  • 400. html
  • 403. html
  • 500. html

当调试为 False 时,它应该使用您的错误页面

在 Django root urls.py 文件中,添加以下代码行

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


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

在应用程序的 views.py 文件中,创建相应的函数。

def server_error(request, exception=None):
# return render(request, '500.html')
return redirect('/')

最后,在 setings.py 文件中设置 DEBUG = False

在 urls.py 中,请输入以下代码:

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


handler404 = 'my_app.views.page_not_found_view'

然后在 views.py 中添加这段代码

from django.shortcuts import render,get_object_or_404
def page_not_found_view(request, exception):
return render(request, '404.html', status=404)

在笔记本电脑中进行测试时,不要忘记设置 DEBUG = False,也要设置 ALLOWED _ HOSTS = [127.0.0.1]