Django 自定义 404 页面不起作用

Posted

技术标签:

【中文标题】Django 自定义 404 页面不起作用【英文标题】:Django custom 404 page not working 【发布时间】:2014-01-02 01:53:15 【问题描述】:

所以,在我的项目中,我想添加一个自定义的 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 时,我需要所有内容都已经在线。对吗?

【问题讨论】:

500错误的回溯是什么? 不要在生产中使用 ALLOWED_HOSTS = ["*"]! @user937284 它有什么危险? @MohammedShareefC 它可以提供对带有伪造的 HTTP 主机头的恶意文件的访问:docs.djangoproject.com/en/3.2/ref/settings/#allowed-hosts 【参考方案1】:

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

在this answer 中查看更多信息。

【讨论】:

【参考方案2】:

在项目文件夹的 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

不要忘记进行必要的导入。另外不要忘记在 staging 测试时更改 settings.py 中的 Debug=False。

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:
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') 这些都不起作用,我仍然不断收到 500 错误。有什么想法吗? 需要配置logger或email reports并放回溯。【参考方案5】:

作为a best practice,我在我的项目中添加了 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)

查看完整教程here

【讨论】:

以上是关于Django 自定义 404 页面不起作用的主要内容,如果未能解决你的问题,请参考以下文章

.htaccess 自定义 503 页面不起作用

旧 ASP.Net 应用程序中的自定义错误页面不起作用

自定义分类页面不起作用

Django 频道 - 自定义路由似乎不起作用

show_404() 中的自定义视图不起作用

启用异常控制器时自定义错误页面不起作用