10

使用 django-cms 时,服务器 403/404/500 错误页面可能是一项微不足道的任务。按照旧论坛帖子上的说明创建此内容:

from cms.views import details

def custom_404(request):
    response = details(request, 'page-not-found')
    response.status_code = 404
    return response
...

Urls.py 有一些这样的行:

handler404 = 'error_pages.views.custom_404'
...

从 traceback django cms 找不到 404 页面:

File "/home/username/.virtualenvs/venv/lib/python2.7/site-packages/cms/views.py", line 22, in _handle_no_page
    raise Http404('CMS: Page not found for "%s"' % slug)

Http404: CMS: Page not found for "page-not-found"

显然,在 django-cms 中使用 slug 添加了所需的自定义页面:'page-not-found'。我错过了一些明显的东西吗?在生产服务器上运行debug=False. 运行 django-cms 2.4.2(编辑)

也许用硬编码的样式表提供简单的错误消息会更好?

4

3 回答 3

9

在走进无数墙壁过度思考问题之后,我只是使用了基本的 403/404/500 处理程序:

from django.utils.functional import curry
from django.views.defaults import *
handler500 = curry(server_error, template_name='500.html')
handler404 = curry(page_not_found, template_name='404.html')
handler403 = curry(permission_denied, template_name='403.html')

为每个错误创建模板并为样式表输入绝对 URL。

问题解决了。浪费了很多时间在这个微不足道的事情上。

于 2013-09-30T18:26:15.517 回答
3

这是一个工作(在 True 或 False 处使用 DEBUG)404 处理程序:

def handler404(request):
    if hasattr(request, '_current_page_cache'):
        delattr(request, '_current_page_cache')

    response = details(request, '404')
    response.status_code = 404
    return response
于 2014-04-01T12:42:27.963 回答
0

编辑/简单的解决方案

经过更多的搜索和思考,一个更简单的解决方案是创建默认/标准 404.html,并在其中使用 django-cms 静态占位符......尽可能简单!

原始(仍在工作)答案

在努力从旧的 cms 项目更新我的 handler404 后,没有找到关于这个主题的任何信息,并且接受的答案不是问题的真正解决方案,我调查并找到了一个适用于 django-cms 3.4 的版本。

值得注意

  • 删除_current_page_cache请求
  • 设置request.current_page,或者cms_tags不会使用您的 404 页面并呈现为空
  • 调用主 cmsdetails视图以呈现页面
  • 最后,打电话response.render()(如评论中所述)

风景

def handler404(request):
    if hasattr(request, '_current_page_cache'):  # we'll hit the cache otherwise
        delattr(request, '_current_page_cache')
    page = get_page_from_request(request, '404')
    request.current_page = page  # templatags seem to use this.
    response = details(request, '404')  # the main cms view
    if hasattr(response, 'render'):  # 301/302 dont have it!
        response.render()  # didnt know about this, but it's needed
    response.status_code = 404  # the obvious
    return response
于 2017-06-13T10:59:31.117 回答