Армин Роначер. Собственные страницы ошибок во Flask, 2012

Перевод статьи: Custom Error Pages

Автор: Армин Роначер (Armin Ronacher)

Flask поставляется с удобной функцией abort(), которая досрочно прерывает запрос с кодом ошибки HTTP. В комплекте с ней идут простая чёрно-белая страница ошибки с небольшим описанием, ничего особого.

В зависимости от кода ошибки, с разной степенью вероятности, пользователь может увидеть эту страницу.

1. Обычные коды ошибок

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

404 Не найдено

Старое доброе сообщение "чувак, ты допустил ошибку при вводе URL". Встречается настолько часто, что даже новички в интернете знают, что означает 404: блин, тут нет того, что я искал. Неплохо поместить на этой странице что-то более полезное, хотя-бы ссылку на стартовую страницу.

403 Запрещено

Если на сайте есть какая-нибудь разновидность ограничения доступа, может понадобиться отправить код 403 при попытке доступа к ресурсам, доступ к которым запрещён. Позволяет не потерять пользователя, который попытался получить доступ к запрещённому ресурсу.

410 Удалено

Вы знаете, что у "404 Не найдено" есть брат по имени "410 Удалено"? Мало кто делает так, что прежде существовавшие, но ныне удалённые ресурсы отвечают ошибкой 410 вместо 404. Если вы не удаляете документы из базы данных навсегда, а просто помечаете их как удалённые, можно сделать пользователю одолжение и воспользоваться кодом 410, а не отображать сообщение о том, что искомое было удалено навечно.

500 Внутренняя ошибка сервера

Обычно происходит в случае ошибок в программе или при повышенной нагрузке на сервер. Ужасно хорошо было бы иметь на этот случай приятную страницу, потому что рано или поздно в приложении может случится сбой (см. также: Журналирование ошибок приложения).

2. Обработчики ошибок

Обработчик ошибок - это функция, похожая на функцию представления, только она принимает возникающие ошибки. Большинство ошибок - это ошибки типа HTTPException, но это могут быть и другие ошибки, потому что в обработчик внутренних ошибок сервера попадают все остальные не перехваченные экземпляры исключений.

Обработчик ошибок регистрируется при помощи декоратора errorhandler() с кодом ошибки. Помните, что Flask не устанавливает код ошибки за вас, поэтому удостоверьтесь, что возвращаете в ответе код статуса HTTP.

Здесь приведён пример обработки исключения "404 Страница не найдена":

from flask import render_template

@app.errorhandler(404)
def page_not_found(e):
    return render_template('404.html'), 404

Шаблон для этого примера может быть таким:

{% extends "layout.html" %}
{% block title %}Страница не найдена{% endblock %}
{% block body %}
  <h1>Страница не найдена</h1>
  <p>Здесь нет того, что вы искали.
  <p><a href="{{ url_for('index') }}">Вот клёвое место.</a>
{% endblock %}

3. Примечания переводчика

После прочтения перевода у вас может возникнуть недоумение - что за "чувак" и "клёво"? Я не стал бы добавлять в текст эти слова по собственной инициативе - я просто попытался в меру своих скудных способностей воспроизвести стиль оригинального текста. В оригинале этим словам соответствуют chap и nice.

Более подробный список кодов статуса HTTP можно увидеть здесь: Список кодов состояния HTTP.

Этот и другие переводы можно найти на сайте проекта перевода документации по Flask. Автор проекта - Виталий Кузьмин aka ferm32.

Написать автору перевода