Evgenii Legotckoi
Evgenii Legotckoi21 вересня 2016 р. 00:13

Django - Підручник 006. Налаштування сторінок помилок 403, 404, 500

Багато ресурсів мають оформлені сторінки помилок, якщо відбувається збій у обробці запиту від клієнта.
Для початку на сайті була зроблена кастомізація помилок, що найчастіше виникають, інші при налагодженні поки не траплялися, але все попереду.

Як оголошено в заголовку статті, кастомізовано були такі помилки:

  1. 403 - Помилка авторизації, доступ заборонено.
  2. 404 - Сторінка не знайдено;
  3. 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 .

Рекомендуємо хостинг TIMEWEB
Рекомендуємо хостинг TIMEWEB
Стабільний хостинг, на якому розміщується соціальна мережа EVILEG. Для проектів на Django радимо VDS хостинг.

Вам це подобається? Поділіться в соціальних мережах!

Владислав Меленчук
  • 06 травня 2020 р. 09:42

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

Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
Ua

Qt - Тест 001. Сигналы и слоты

  • Результат:84бали,
  • Рейтинг балів4
Ua

Qt - Тест 001. Сигналы и слоты

  • Результат:42бали,
  • Рейтинг балів-8
ОК

Qt - Тест 001. Сигналы и слоты

  • Результат:47бали,
  • Рейтинг балів-6
Останні коментарі
ИМ
Игорь Максимов22 листопада 2024 р. 11:51
Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii Legotckoi31 жовтня 2024 р. 14:37
Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZE19 жовтня 2024 р. 08:19
Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов05 жовтня 2024 р. 07:51
Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas505 липня 2024 р. 11:02
QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Тепер обговоріть на форумі
Дмитрий
Дмитрий03 лютого 2025 р. 06:24
Создание deb-пакета. Как создать ярлык на рабочем столе после установки собственного deb-пакета? Всем привет. Сделал свой deb-пакет с программой. Всё устанавливается и работает. Ставлю по пути /usr/bin/my_application. Как для пользователя при установке пакета сразу создать ярлык на раб…
NW
Nayo Wai30 січня 2025 р. 09:22
не запускается компьютер!!! Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
n
nkly03 січня 2025 р. 02:52
Нужно запретить перемещение только некоторых итемов, остальные перемещать можно. Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
M
Marsel16 серпня 2023 р. 14:26
OAuth2.0 через VK, получение email Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.
Evgenii Legotckoi
Evgenii Legotckoi24 червня 2024 р. 15:11
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.

Слідкуйте за нами в соціальних мережах