Django 404页面未加载

Posted

技术标签:

【中文标题】Django 404页面未加载【英文标题】:Django 404 Page not loading 【发布时间】:2017-08-18 07:44:30 【问题描述】:

我制作了一个简单的 django 应用程序,用于使用 django 1.10 创建我的自定义 404 页面。 我在我的页面中创建了 404.html 和 500.html,根据 Django 文档。然后我尝试了两种方法来呈现 404 错误消息。

1)我做了简单的 404.html 和 500.html 页面,然后什么也没做。 我成功地获得了 500 页。 页面的正确 url 是:localhost:8000/book 我提供了 localhost:8000/book/fgfg 根据输入没有条目。但它把我送到了 500 页面,而不是我预期的 404 页面。 这是内部应用的 Urls.py:

from django.conf.urls import url
from django.conf.urls import (
handler400, handler403, handler404, handler500
 )
from bookform import views
from . import views
urlpatterns = [
url(r'^$', views.index, name='index'),]

这是外部项目的 urls.py:

 from django.conf.urls import url,include,handler404,handler500
 from django.contrib import admin


 urlpatterns = [
  url(r'^admin/', admin.site.urls),
  url(r'^book/', include('bookform.urls')),
]
# handler404='bookform.views.handler404'
# handler500='bookform.views.handler500'

我在这里注释了 handler404 和 500,我在第二种方法中取消了注释。 在第一种方法中,除了添加 404 和 500 html 文件外,我什么也没做,Django 试图找出 url 并导致 500 错误,但我希望它是 404 错误。 将Debug设置为true时显示此错误: 使用 formdj.urls 中定义的 URLconf,Django 按以下顺序尝试了这些 URL 模式: ^管理员/ ^book/ ^$ [名称='索引'] 当前 URL book/dfsdfsd 与其中任何一个都不匹配。

如果我设置 DEBUG=FALSE 会导致 500 错误。

2) 现在在方法 2 中: 我更新了 views.py 文件并取消了 urls.py 中的 handler404 和 handler505 行的注释。

这是views.py:

  from django.shortcuts import render,render_to_response
  from django.shortcuts import HttpResponse
  from django.forms import modelformset_factory
  from forms import BookForm
  from bookform.models import Book
  from django.template import RequestContext
  def index(request):

     BookFormSet=modelformset_factory(Book,fields= ('name','authors'),extra=10,can_delete=True)
    formset=BookFormSet()
    return render(request,'bookform/index.html','formset':formset)

  def handler404(request):
    response = render(request,'bookform/404.html', 'status':400,
                            )
    response.status_code = 404
    print('I am getting called')
    return response
 def handler500(request):
    response = render(request,'bookform/500.html', 'status':400,
                              )
    print('I am getting called 500')
    response.status_code = 500
    return response

我再次得到 500 页面。我试图删除 500 并且 Debug=False 然后它导致 500。然后我打开调试,它说错误是 404 错误。 所以无论我做什么,我都得到了一个名为 500.html 的页面。 现在我很困惑如何正确加载 404.html 页面。

【问题讨论】:

【参考方案1】:

在项目文件夹的 urls.py 中添加以下内容,其中帐户(可以是任何应用程序)是同一项目的应用程序:

project/urls.py

handler404 = 'accounts.views.page_not_found'

在帐户视图中添加:

accounts/views.py

def page_not_found(request):
    """Page not found Error 404"""

     response = render_to_response('404.html',context_instance=RequestContext(request))
     response.status_code = 404
     return response

不要忘记进行必要的导入,最好在 urls 模式上方添加 handler404 内容。也不要忘记在 staging 测试时更改 settings.py 中的 Debug=False

【讨论】:

【参考方案2】:

试试这样的视图:

from django.views.generic.base import TemplateView

class Error404View(TemplateView):
    template_name = '404.html'

    def get(self, request, *args, **kwargs):
        response = super(Error404View, self).get(request, *args, **kwargs)
        response.status_code = 404
        return response

    @classmethod
    def as_error_view(cls):
        v = cls.as_view()
        def view(request):
            r = v(request)
            r.render()
            return r
        return view

urls.py:

handler404 = Error404View.as_error_view()

【讨论】:

以上是关于Django 404页面未加载的主要内容,如果未能解决你的问题,请参考以下文章

nginx - django 2 -angular 6 / 角度路由在重新加载页面后得到 404

找不到 Django 404 错误页面...当前路径与最后一个匹配

Django HTTP 错误 404:未找到:在我的视图中使用 config.json 文件

在 django 中实现 http404

Django:找不到页面(404)

Django 1.8 如何创建自己的 404 页面?