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




django-templates http-status-code-404 (11)

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并处理其中的站点范围错误,上下文处理器。

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


从您引用的页面:

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

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

handler404 = 'views.my_404_view'

和handler500类似。


# 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


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

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

希望这有帮助!!!


如果你需要的是在DEBUG = False时显示自己的网站有一些奇特的错误消息的自定义页面,那么在你的模板目录中添加两个名为404.html和500.html的模板,它会自动选择这个自定义页面。提出404或500。


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

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


官方答复:

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

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才能使这些工作正常,否则将使用正常的调试处理程序。


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

在您的主视图.py下添加您自己的以下两个视图的自定义实现,只需设置模板404.html500.html以及您想要显示的内容。

使用此解决方案,不需要向urls.py添加自定义代码

这是代码:

from django.shortcuts import render_to_response
from django.template import RequestContext


def handler404(request):
    response = render_to_response('404.html', {},
                                  context_instance=RequestContext(request))
    response.status_code = 404
    return response


def handler500(request):
    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-viewshttps://docs.djangoproject.com/en/2.0/ref/views/#error-views

如果您使用上述视图,handler404将失败并显示以下消息:

“handler404()得到了一个意外的关键字参数'exception'”

在这种情况下修改您的视图,如下所示:

def handler404(request, exception, template_name='404.html'):
    ... 

对于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文件,并在url模式后添加此行:

handler404 = 'myapp.views.error_404_view'

现在,如果您转到浏览器并打开任何不存在的URL,您将看到自定义404错误页面。


  1. 您可以使用create(self, validated_data)将任何额外的详细信息添加到对象中,然后将“prod”值保存到每个模型字段中,就像**validated_data一样。 理想情况下,您只想在一个位置执行这种“刺激”形式,因此CommentSerializercreate方法是最佳位置。 除此之外,您可能还希望在将帐户保存到自己的数据库之前调用外部apis来创建用户帐户。 您应该将此create函数与ModelViewSet结合使用。 总是想 - “薄视图,厚序列化器”。

例:

def create(self, validated_data):
    email = validated.data.get("email", None)
    validated.pop("email") 
    # Now you have a clean valid email 
    # You might want to call an external API or modify another table
    # (eg. keep track of number of accounts registered.) or even
    # make changes to the email format.

    # Once you are done, create the instance with the validated data
    return models.YourModel.objects.create(email=email, **validated_data)
  1. create(self, request, *args, **kwargs)create(self, request, *args, **kwargs)函数在CreateModelMixin类中定义,该类是CreateModelMixin的父级。 CreateModelMixin的主要功能如下:

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)
        return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
    
    def perform_create(self, serializer):
        serializer.save()
    

如您所见,上面的create函数负责在序列化程序上调用验证并生成正确的响应。 这背后的美妙之处在于,您现在可以隔离您的应用程序逻辑,而不关心平凡和重复的验证调用以及处理响应输出:)。 这与在序列化程序中找到的create(self, validated_data) (您的特定应用程序逻辑可能驻留在其中)相结合非常有效。

  1. 现在你可能会问,为什么我们只用一行代码就有一个单独的perform_create(self, serializer)函数!?!? 那么,这背后的主要原因是在调用save函数时允许自定义。 您可能希望在调用save之前提供额外的数据(如serializer.save(owner=self.request.user) ,如果我们没有perform_create(self, serializer) ,则必须覆盖create(self, request, *args, **kwargs) ,这恰好击败了mixin做沉重而枯燥的工作的目的。

希望这可以帮助!





python django django-templates http-status-code-404