Багато ресурсів мають оформлені сторінки помилок, якщо відбувається збій у обробці запиту від клієнта.
Для початку на сайті була зроблена кастомізація помилок, що найчастіше виникають, інші при налагодженні поки не траплялися, але все попереду.
Як оголошено в заголовку статті, кастомізовано були такі помилки:
- 403 - Помилка авторизації, доступ заборонено.
- 404 - Сторінка не знайдено;
- 500 – Внутрішня помилка сервера;
Кастомізація помилок 404, 500
Для кастомізації помилок 404 і 500 необхідно написати обробники запитів і досить написати їх подання у вигляді методу.
До шаблонів додаємо свої кастомізовані html файли, тобто:
- error404.html
- error500.html
Модуль, в якому реалізовані уявлення для даного сайту - це home. У шаблонах цього ж модуля розміщені самі шаблони кастомізованих помилок.
У файлі urls.py головного модуля сайту перевизначаємо обробники за замовчуванням:
- обробник404
- обробник 500
У коді це виглядає так:
from home.views import e_handler404, e_handler500 handler404 = e_handler404 handler500 = e_handler500
Опишемо представлення у файлі views.py модуля home:
from django.shortcuts import render_to_response from django.template import RequestContext def e_handler404(request): context = RequestContext(request) response = render_to_response('error404.html', context) response.status_code = 404 return response def e_handler500(request): context = RequestContext(request) response = render_to_response('error500.html', context) response.status_code = 500 return response
Кастомізація помилки 403
Помилка 403 виникає в тому випадку, коли авторизований користувач намагається отримати доступ до тієї частини сайту, в яку доступ дозволений тільки авторизованим користувачам.
У Django це досягається за рахунок перевірки статусу користувача та додавання на сторінки захисного токена, механізм CSRF. Ця помилка може виникнути і в тому випадку, якщо користувач авторизований, але робить дії, при яких потрібна перевірка токена CSRF, а сам токен був втрачений чи не вірний. Справа в тому, що для коректності роботи токена необхідно додавати в шаблоні у формах спеціальний тег:
{% csrf_token %}
У нього і буде підставлятися токен, але просто додати шаблон, його мало. Перш, ніж почати рендер шаблон, необхідно додати токен в контекст, який буде переданий шаблон. Тобто,
from django.template.context_processors import csrf from django.shortcuts import render_to_response def any_request(request): context = {} context.update(csrf(request)) ... return render_to_response('any_request.html', context=context)
Ну а тепер ближче безпосередньо кастомізації. Для роботи csrf необхідно, щоб у файлі settings.py доданий модуль csrf та вказано уявлення, яке займатиметься обробкою цієї помилки:
MIDDLEWARE = [ ... 'django.middleware.csrf.CsrfViewMiddleware', ... ] CSRF_FAILURE_VIEW = 'home.views.csrf_failure'
У шаблонах додамо error403.html, а у файлі views.py пропишемо обробник вистави.
def csrf_failure(request, reason=""): context = RequestContext(request) response = render_to_response('error403.html', context) response.status_code = 403 return response
Для Django рекомендую VDS-сервера хостера Timeweb .
Супер, очень полезно!