Django自定义404页面无效。

9

所以,在我的项目中,我想添加一个自定义的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')

每当我尝试输入随机的url时,却没有得到404错误,而是收到了服务器错误(500)。
正如我所说,我已经尝试了很多不同的方法,但都没有真正起作用。
另外,我遇到的另一个问题是我的页面加载非常缓慢,它们不会加载样式或图像,因此我认为在DEBUG = False时,需要将所有内容都在线上。这是正确的吗?

2
500错误的回溯是什么? - iMom0
2
在生产环境中不要使用 ALLOWED_HOSTS = ["*"]! - user937284
@user937284 它可能会带来哪些危险? - Mohammed Shareef C
@MohammedShareefC 它可以提供对HTTP中伪造主机标头的恶意文件的访问:https://docs.djangoproject.com/en/3.2/ref/settings/#allowed-hosts - Zoltán Schmidt
5个回答

6

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

更多信息请参见此答案


3
在项目文件夹的urls.py中添加以下内容,其中accounts是同一项目中的一个应用程序(可以是任何应用程序): 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

别忘了进行必要的导入。同时在测试阶段,不要忘记在settings.py中将Debug=False更改为True。


2

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


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

作为另一个例子:
def error404(request):
    return render(request,'404.html', status=404)

你没有在urlpatterns中指定吗?尝试添加('^404/$','HogwartsMail.views.error404') - crazyzubr
所有的工作都没有用,我仍然不断收到500错误。有什么想法吗? - AugustoQ
需要配置日志记录器电子邮件报告,并放置回溯信息。 - crazyzubr

1
作为最佳实践,我在我的项目中添加了2个urls.py。因此,我在我的基本urls.py中添加了handler404。我的父级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_404 是我在 views.py 中的一个视图。就像这样:

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

检查完整的教程在这里

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接