使用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(编辑)
或许最好只使用硬编码样式表提供简单的错误消息?
答案 0 :(得分: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。
问题解决了。在这件微不足道的事情上浪费了很多时间。
答案 1 :(得分:3)
这是一个工作(使用DEBUG为True或False)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
答案 2 :(得分:0)
编辑/简易解决方案
经过更多的搜索和思考,一个更简单的解决方案是创建默认/标准404.html,并在其中使用django-cms静态占位符......尽可能简单!
原创(仍然有效)回答
在努力从旧的cms项目更新我的handler404,并且没有找到关于这个主题的任何信息,并且接受的答案不是问题的真正解决方案之后,我调查并发现了一个适用于django-cms 3.4的版本。
值得注意
_current_page_cache
request.current_page
,或cms_tags
不会使用您的404页面并呈现空白details
视图以呈现页面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