Evgenii Legotckoi
21 сентября 2016 г. 10:13

Django - Урок 006. Кастомизация страниц ошибок 403, 404, 500

Многие ресурсы имеют оформленные страницы ошибок, если происходит сбой в обработке запроса от клиента.
Для начала на сайте была сделана кастомизация наиболее часто возникающих ошибок, другие при отладке пока не попадались, но всё впереди.

Как объявлено в заголовке статьи, кастомизированы был следующие ошибки:

  1. 403 - Ошибка авторизации, доступ запрещён.
  2. 404 - Страница не найдена;
  3. 500 - Внутренняя ошибка сервера;

Кастомизация ошибок 404, 500

Для кастомизации ошибок 404 и 500 необходимо написать обработчики запросов, и достаточно написать их представления в виде метода.

В шаблоны добавляем свои кастомизированные html файлы, то есть:

  • error404.html
  • error500.html

Модуль, в котором реализованы представления для данного сайта - это home. В шаблонах этого же модуля помещены сами шаблоны кастомизированных ошибок.

В файле urls.py главного модуля сайта переопределяем обработчики по умолчанию:

  • handler404
  • handler500

В коде это выглядит так:

  1. from home.views import e_handler404, e_handler500
  2.  
  3. handler404 = e_handler404
  4. handler500 = e_handler500

Опишем представления в файле views.py модуля home:

  1. from django.shortcuts import render_to_response
  2. from django.template import RequestContext
  3.  
  4.  
  5. def e_handler404(request):
  6. context = RequestContext(request)
  7. response = render_to_response('error404.html', context)
  8. response.status_code = 404
  9. return response
  10.  
  11.  
  12. def e_handler500(request):
  13. context = RequestContext(request)
  14. response = render_to_response('error500.html', context)
  15. response.status_code = 500
  16. return response

Кастомизация ошибки 403

Ошибка 403 возникает в том случае, когда не авторизованный пользователь пытается получить доступ к той части сайта, в которую доступ разрешён только авторизованным пользователям.

В Django это достигается за счёт проверки статуса пользователя и добавления на страницы защитного токена, механизм CSRF. Данная ошибка может возникнуть и в том случае, если пользователь авторизован, но совершает действия, при которых требуется проверка токена CSRF, а сам токен был потерян или не верен. Дело в том, что для корректности работы токена, необходимо добавлять в шаблоне в формах специальный тег:

  1. {% csrf_token %}

В него и будет подставляться токен, но просто добавить в шаблон, его не достаточно. Прежде, чем начать рендер шаблон, необходимо добавить токен в контекст, который будет передан в шаблон. То есть,

  1. from django.template.context_processors import csrf
  2. from django.shortcuts import render_to_response
  3.  
  4.  
  5. def any_request(request):
  6. context = {}
  7. context.update(csrf(request))
  8.  
  9. ...
  10. return render_to_response('any_request.html', context=context)

Ну а теперь ближе к непосредственно кастомизации. Для работы csrf необходимо, чтобы в файле settings.py добавлен модуль csrf и указано представление, которое будет заниматься обработкой данной ошибки:

  1. MIDDLEWARE = [
  2. ...
  3. 'django.middleware.csrf.CsrfViewMiddleware',
  4. ...
  5. ]
  6.  
  7. CSRF_FAILURE_VIEW = 'home.views.csrf_failure'

В шаблонах добавим error403.html, а в файле views.py пропишем обработчик представления.

  1. def csrf_failure(request, reason=""):
  2. context = RequestContext(request)
  3. response = render_to_response('error403.html', context)
  4. response.status_code = 403
  5. return response

Для Django рекомендую VDS-сервера хостера Timeweb .

Вам это нравится? Поделитесь в социальных сетях!

Супер, очень полезно!

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь