Пользовательские страницы ошибок для django-cms
предположительно тривиальная задача для сервера 403/404/500 страниц ошибок при использовании django-cms. Следуйте инструкциям на старом форуме, чтобы создать это:
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 со слизняком: "страница-не найдена". Я упускаю что-то очевидное? Запуск на рабочем сервере с debug=False
. Бегущий django-cms 2.4.2 (правка)
возможно, лучше просто обслуживать простые сообщения об ошибках с жестко закодированными таблицами стилей?
3 ответов
после того, как я вошел в бесчисленные стены, обдумывая проблемы, я просто пошел с использованием основных обработчиков 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-адреса для таблиц стилей.
проблема решена. Потратил кучу времени на такую ерунду.
вот рабочий (с 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
редактировать / простое решение
после большего поиска и мышления более простым решением было бы создать стандарт по умолчанию/standard 404.html, и в нем используйте статические заполнители django-cms...так же просто, как и получается!
оригинальный (все еще работает) ответ
после борьбы с обновлением моего handler404 из старого проекта cms, и не найдя никакой информации по этой теме, и принятый ответ не является реальным решением проблемы, я исследовал и нашел версию, которая работает в django-cms 3.4.
отметить
- удалить
_current_page_cache
на запрос - set
request.current_page
илиcms_tags
не будет использовать вашу страницу 404 и отображать пустую - вызовите основную cms
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