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

Zac*_*Zac 86 python django django-templates http-status-code-404

按照此处找到的教程,我无法创建自定义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
Run Code Online (Sandbox Code Playgroud)

在mysite/settings.py中我启用了这些:

DEBUG = False
TEMPLATE_DEBUG = DEBUG

#....

TEMPLATE_DIRS = (
    'C:/Users/Me/Django/mysite/templates', 
)
Run Code Online (Sandbox Code Playgroud)

在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'),
)
Run Code Online (Sandbox Code Playgroud)

我可以发布任何其他必要的代码,但是如果我使用错误的网址,我应该如何更改以获取自定义500错误页面?

编辑

解决方案: 我有一个额外的

TEMPLATE_DIRS
Run Code Online (Sandbox Code Playgroud)

在我的settings.py中,这导致了问题

Aar*_*ier 108

在您的主要内容下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
Run Code Online (Sandbox Code Playgroud)

更新

handler404并且handler500导出了Django字符串配置变量django/conf/urls/__init__.py.这就是上面配置的原因.

要使上述配置生效,您应该在urls.py文件中定义以下变量,并将导出的Django变量指向定义这些Django功能视图的字符串Python路径,如下所示:

# project/urls.py

handler404 = 'my_app.views.handler404'
handler500 = 'my_app.views.handler500'
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

  • @GravityGrave`500模板`不会呈现`request.user`,因为它报告了500服务器错误,因此服务器无法提供任何服务. (10认同)
  • 用django 1.9不能为我工作;(也许我做错了.处理程序404 django保留名称吗?django怎么会知道它应该调用那个视图? (5认同)
  • `render_to_response` 在 Django 3.0 中被 `render` 取代,它自动使用 `RequestContext`,简化了这个答案的示例代码 (2认同)
  • 在 Django 3.0 中,“render()”还支持可选的“status”参数,因此您可以相应地简化答案。 (2认同)

Fli*_*imm 57

官方答复:

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

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'
Run Code Online (Sandbox Code Playgroud)

您还可以通过修改设置来自定义CSRF错误视图CSRF_FAILURE_VIEW.

默认错误处理程序:

这是值得一读的默认错误处理程序的文档page_not_found,server_error,permission_deniedbad_request.默认情况下,它们分别使用这些模板,如果他们能找到他们,: ,404.html,500.html,403.html400.html.

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

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

疑难杂症:

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

  • ** 发现 ** 帮助了我。它的工作原理是在我的 settings.py 中进行这些更改,设置 DEBUG=False 和 ALLOWED_HOSTS = ['0.0.0.0'] 以接受来自任何客户端的 http 请求。 (2认同)
  • 以防万一其他人想知道 URLconf 到底在哪里,[这里就是](https://docs.djangoproject.com/en/2.2/topics/http/urls/#example) (2认同)

Arm*_*nce 33

在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'

# ...
Run Code Online (Sandbox Code Playgroud)

并在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

# ...
Run Code Online (Sandbox Code Playgroud)

  • 你为什么要导入`handler400`只用`handler400 ='myapp.views.bad_request'来覆盖它? (4认同)
  • 您无需在此处导入处理程序以覆盖它们. (4认同)
  • 您不应该使用“render_to_response”。从文档中可以看出:“不推荐这样做,并且将来可能会被弃用。” (3认同)

Mik*_*ley 19

从您引用的页面:

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

所以我相信你需要在你的urls.py中添加这样的东西:

handler404 = 'views.my_404_view'
Run Code Online (Sandbox Code Playgroud)

和handler500相似

  • @JimRilye您需要为视图添加合适的500函数,然后使用该变量引用它.因此,在你的`urlpatterns = ...`行之上,添加一行"handler500 ='views.handle500'`,然后在你的views.py中添加`def handle500(request):`,显示你的500. HTML. (2认同)

ela*_*no7 19

Django 3.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'
Run Code Online (Sandbox Code Playgroud)

并在该应用程序 ( 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", {})
Run Code Online (Sandbox Code Playgroud)

注意:error/404.html如果您将文件放入项目(而不是应用程序)模板文件夹中templates/errors/404.html,则是路径,因此请将文件放在您想要的位置并写入正确的路径。

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

  • 您需要在 render() 调用中添加 `status=&lt;status_code&gt;` 参数,否则您将在响应中得到状态 200。例如,“status=500”表示 500 个页面。 (4认同)
  • 额外注意:如果您在“DEUB=False”下运行,则可能无法提供静态文件,从而使您无法预览自定义错误模板更改。使用 ./manage.py runserver --insecure 强制 django 为它们提供服务。 (3认同)

Kri*_*air 18

如果你需要的只是显示自定义页面,当你的网站有一些奇特的错误消息DEBUG = False,然后在你的模板目录中添加两个名为404.html和500.html的模板,它会在404或500时自动获取这些自定义页面被提出来了.


Reh*_*mat 14

在 Django 中3.x,接受的答案将不起作用,因为render_to_response已被完全删除,并且自接受的答案适用的版本以来已经进行了更多更改。

还有其他一些答案,但我提出了一个更简洁的答案:

在您的主urls.py文件中:

handler404 = 'yourapp.views.handler404'
handler500 = 'yourapp.views.handler500'
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

请确保您已导入render()yourapp/views.py文件:

from django.shortcuts import render
Run Code Online (Sandbox Code Playgroud)

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


Anu*_*TBE 12

不需要额外的视图。https://docs.djangoproject.com/en/3.0/ref/views/

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

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

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


Rak*_*abu 9

settings.py ::::

DEBUG = False
TEMPLATE_DEBUG = DEBUG
ALLOWED_HOSTS = ['localhost']  #provide your host name
Run Code Online (Sandbox Code Playgroud)

并在模板文件夹中添加您的404.html和500.html页面.从民意调查应用中的模板中删除404.html和500.html.


DeN*_*DeN 8

Django 2.*中,您可以在views.py中使用此构造

def handler404(request, exception):
    return render(request, 'errors/404.html', locals())
Run Code Online (Sandbox Code Playgroud)

settings.py中

DEBUG = False

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

if DEBUG is True:
    ALLOWED_HOSTS = []
Run Code Online (Sandbox Code Playgroud)

urls.py中

# https://docs.djangoproject.com/en/2.0/topics/http/views/#customizing-error-views
handler404 = 'YOUR_APP_NAME.views.handler404'
Run Code Online (Sandbox Code Playgroud)

通常我创建default_app并处理其中的站点范围错误,上下文处理器.


all*_*yed 7

出错,在错误页面上找出django加载模板的位置.我的意思是路径堆栈.在base template_dir中添加这些html页面500.html,404.html.发生这些错误时,将自动加载相应的模板文件.

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

希望这有帮助!!!


Fir*_*enk 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)
Run Code Online (Sandbox Code Playgroud)

  • 以及在哪里使用它? (2认同)

END*_*ESA 5

# 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' 
Run Code Online (Sandbox Code Playgroud)

这适用于 Django 2.0

请务必将您的自定义404.html包含在应用程序模板文件夹中。