【问题标题】:Custom 404 django template自定义 404 django 模板
【发布时间】:2017-02-20 11:57:35
【问题描述】:

我正在尝试在我的应用程序中自定义 404 错误页面。在搜索了许多可能的解决方案后,我创建了一个 404.html 模板,添加了一个应该处理 HTTP 错误 404 的方法并编辑了我的 urls.py。

但我想我做错了什么。我的日志出现无效的语法错误,我无法解决。

我的意见.py:

# HTTP Error 400
def page_not_found(request):
    response = render_to_response('404.html',context_instance=RequestContext(request))
    response.status_code = 404

    return response

还有语法错误:

Traceback (most recent call last):
File "/.../myenv/lib/python3.4/site-packages/django/core/urlresolvers.py", line 393, in urlconf_module
return self._urlconf_module
AttributeError: 'RegexURLResolver' object has no attribute '_urlconf_module'
...
File "<frozen importlib._bootstrap>", line 321, in _call_with_frames_removed
File "/home/dcaled/work/portal-interface/portal/urls.py", line 12
handler404 = 'views.handler404'
              ^
SyntaxError: invalid syntax

有人知道发生了什么吗? 谢谢。

更新: 在@Alasdair 建议之后,我进行了一些更改和修复。错误已停止。

现在,我的 urls.py 是这样的:

handler404 = 'views.page_not_found'

urlpatterns = [
    url(r'^$', views.home),]    

但在访问不存在的页面时,我仍然没有得到我的自定义 404.html。 相反,会加载默认页面,并显示以下消息:

"未找到

在此服务器上找不到请求的 URL /url/404。"

还有,我的 settings.py:

DEBUG = False
ALLOWED_HOSTS = ['*']
TEMPLATE_DIRS = (os.path.join(BASE_DIR , 'portal/templates'),)

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

我的项目树:

├── fb_dev
│   ├── __init__.py
│   ├── __pycache__
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── manage.py
│
└── portal
    ├── admin.py
    ├── forms.py
    ├── json
    ├── migrations
    ├── models.py
    ├── static
    ├── templates
    │   ├── 404.html
    │   └── portal
    │       ├── base.html
    │       ├── home.html
    ├── templatetags
    ├── urls.py
    └── views.py

【问题讨论】:

  • 您使用的是哪个版本的 Django?您的404.html 模板在哪里?
  • 我的版本是1.8.5。我用模板位置更新了问题。
  • 您有TEMPLATES 设置吗?您的代码的其他部分是否成功在portal/templates 中找到模板?可能是您的browser 或您的服务器(例如 Apache)劫持了 404 页面。
  • @Alasdair,感谢您继续帮助我。是的,我有一个模板设置。我用它编辑了我的问题。是的,我的代码的其他部分在那里找到模板。我不知道我的浏览器是否在劫持 404 页面。 Firefox 会发生此错误。在 Chrome 中,它会加载“服务器错误 (500)”页面。我在本地运行它。奇怪的是,调试的时候,好像从来没有进入我的page_not_found方法。
  • 您应该删除 TEMPLATE_DIRS - 它已过时并且您已经拥有 TEMPLATES 设置。如果portal 在您的INSTALLED_APPS 设置中,那么离开'DIRS': [] 应该没问题。正如我在你的回答中所说,我认为你应该完全删除你的 handler404 行。你的视图没有做任何特别的事情,所以你让 Django 使用默认的。

标签: python django


【解决方案1】:

几个月后,我重新审视了这个问题并找到了解决方案。答案如下:

a) 我从 views.py 中删除了 page_not_found 方法。没有必要添加它。 Django 自动获取并渲染 404.html 模板。

b) 再次,无需编辑 urls.py。所以我删除了这一行:

handler404 = 'views.page_not_found'

c) 另外,需要编辑settings.py,将DEBUG设置为FALSE

DEBUG = False

我删除了以下行:

TEMPLATE_DIRS = (os.path.join(BASE_DIR , 'portal/templates'),)

d) 最后,我在portal/templates 目录中创建了一个 404.html 模板。值得注意的是,自定义模板仅在放置在此目录中时才会呈现。

【讨论】:

    【解决方案2】:

    经过一些麻烦后,revy 解决方案完美运行。所以,澄清一下:

    要做的两件事是:

    • your_app/template/404.html 中添加404.html 文件
    • 将 DEBUG 值设置为 False

    之后,Django 会自动渲染你的模板。

    【讨论】:

      【解决方案3】:

      handler404 应该在urlpatterns 之外。如果视图被称为page_not_found,那么它应该引用page_not_found,而不是handler404

      handler404 = 'views.page_not_found'
      
      urlpatterns = [
          url(r'^$', views.home),
      ]
      

      但是,在您的情况下,您根本不需要自定义 404 处理程序。完全删除handler404 行,默认的page_not_found 视图将呈现您的404.html 模板。

      【讨论】:

      • 是的,你是对的。我做了这些更改,但它仍然没有显示自定义的 404 页面。它只显示“未找到在此服务器上未找到请求的 URL /url/404”。还有其他想法吗?
      • 没有。 DEBUG 实际上是 False。
      猜你喜欢
      • 2015-11-06
      • 2013-09-29
      • 2012-03-05
      • 1970-01-01
      • 2019-04-03
      • 2018-09-07
      • 2015-12-01
      • 2017-05-02
      • 2021-07-13
      相关资源
      最近更新 更多