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 错误页面...当前路径与最后一个匹配