Django自定义404页面无效

时间:2013-12-14 07:58:55

标签: python django error-handling http-status-code-404

所以,在我的项目中,我想添加一个自定义的404错误页面,所以我按照我在网络上找到的内容,但似乎没有什么对我有用。

这就是我的文件:

settings.py

import os
# Django settings for HogwartsMail project.

PROJECT_PATH = os.path.realpath(os.path.dirname(__file__))

DEBUG = False
TEMPLATE_DEBUG = DEBUG

# Hosts/domain names that are valid for this site; required if DEBUG is False
# See https://docs.djangoproject.com/en/1.5/ref/settings/#allowed-hosts
ALLOWED_HOSTS = ["*"]

urls.py

urlpatterns = patterns('',
    ...
)

handler404 = "HogwartsMail.views.error404"

views.py

def error404(request):
    return render(request,'404.html')

每当我尝试输入随机网址时,我会收到服务器错误(500)而不是404错误。

正如我所说的那样,我尝试了许多不同的方法,但实际上没有一个方法适合我。

此外,我遇到的另一个问题是,我加载的页面速度非常慢,而且它们没有打开样式或图像,因此我认为,当DEBUG = False时,我需要一切都已经在线。这是对的吗?

5 个答案:

答案 0 :(得分:4)

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

<强>项目/ urls.py

handler404 = 'accounts.views.page_not_found'

在帐户视图中添加以下内容:

帐户/ 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

不要忘记进行必要的进口。另外,在测试分段时,不要忘记在settings.py中更改Debug = False。

答案 1 :(得分:3)

DEBUG = False时,您可以使用python manage.py runserver --insecure在本地开发期间提供静态文件。

this answer中查看更多信息。

答案 2 :(得分:0)

def error404(request):
    return HttpResponseNotFound(render_to_string('404.html'))

作为另一个例子:

def error404(request):
    return render(request,'404.html', status=404)

答案 3 :(得分:0)

好的,事实证明我似乎不需要做任何事情,只需创建一个404.html页面。通过创建in,当出现“找不到页面”错误时,Django将首先在模板中查找404.html,然后再使用它自己的错误页面。我的静态文件不在网络上时仍有问题 - 当设置DEBUG = False时,css文件和我的任何图像都不会出现。除此之外,我的问题已经解决了。

答案 4 :(得分:0)

正如a best practice我在项目中添加了2 urls.py。所以我在我的基地handler404中添加了urls.py。我的父urls.py看起来像这样

from django.conf.urls import handler404
import myapp

urlpatterns = [
   path('', include('myapp.urls')),
   path('admin/', admin.site.urls),
]

handler404 = myapp.views.error_404

error_404views.py中的一个视图。像这样

def error_404(request, exception):
    data = {"name": "somthing error"}
    return render(request,'myapp/404.html', data)

查看完整教程here