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

时间:2013-07-15 20:07:02

标签: python django django-templates http-status-code-404

在完全找到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中,这导致了问题

15 个答案:

答案 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

<强>更新

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()得到了一个意外的关键字参数'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_foundserver_errorpermission_deniedbad_request。默认情况下,他们会分别使用这些模板:500.html403.html400.htmlTEMPLATE_DIRS

因此,如果您只想制作漂亮的错误页面,只需在403_csrf.html目录中创建这些文件,您根本不需要编辑URLConf。阅读文档以了解哪些上下文变量可用。

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

疑难杂症:

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

答案 2 :(得分:32)

在urls.py中添加这些行

urls.py

Application.Invoke

并在views.py中实现我们的自定义视图。

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/

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

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

当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/

我不确定这个,但我认为这些必须是网站的“全球”。