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


5 Answers

官方答复:

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

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_FAILURE_VIEW定义CSRF错误视图。

默认错误处理程序:

值得阅读默认错误处理程序的文档, page_not_foundserver_errorpermission_deniedbad_request 。 默认情况下,如果他们可以分别找到这些模板,他们会使用这些模板: 404.html500.html403.html400.html

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

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

疑难杂症:

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

Question

按照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中,这导致了问题




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

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




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

请务必在app templates文件夹中包含自定义404.html




从您引用的页面:

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

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

handler404 = 'views.my_404_view'

和handler500类似。




settings.py ::::

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

只需在模板文件夹中添加404.html和500.html页面即可。 从民意调查应用中的模板中删除404.html和500.html。




Related