Настраиваемые страницы ошибок
Flask поставляется с удобной функцией abort(), которая прерывает запрос с кодом HTTP-ошибки. Она также предоставляет простую черно-белую страницу ошибки с базовым описанием, но без изысков.
В зависимости от кода ошибки, вероятность того, что пользователь увидит такую ошибку, может быть выше или ниже.
Общие коды ошибок
Следующие коды ошибок часто отображаются пользователю, даже если приложение работает правильно:
- 404 Не найдено
-
Знакомое сообщение «извините, вы ошиблись при вводе URL». Такое распространённое сообщение, что даже новички в интернете знают, что 404 означает: чёрт возьми, того, что я искал, нет. Очень полезно убедиться, что на странице 404 есть что-то полезное, как минимум ссылка на главную страницу.
- 403 Запрещено
-
Если у вашего веб-сайта есть система контроля доступа, вы должны отправлять код 403 для недоступных ресурсов. Поэтому убедитесь, что пользователь не потерялся, когда пытается получить доступ к запрещённому ресурсу.
- 410 Удалено
-
Знаете ли вы, что у «404 Не найдено» есть брат под названием «410 Удалено»? Немногие на самом деле его используют, но идея в том, что ресурсы, которые существовали раньше и были удалены, отвечают кодом 410 вместо 404. Если вы не удаляете документы из базы данных навсегда, а просто помечаете их как удалённые, сделайте пользователю одолжение и используйте код 410 вместо этого и отобразите сообщение о том, что то, что они искали, было удалено навсегда.
- 500 Внутренняя ошибка сервера
-
Обычно возникает при ошибках программирования или если сервер перегружен. Очень хорошая идея — иметь там красивую страницу, потому что ваше приложение обязательно сломается рано или поздно (см. также: Ошибки приложения).
Обработчики ошибок
Обработчик ошибок — это функция, которая возвращает ответ, когда возникает тип ошибки, аналогично тому, как представление — это функция, которая возвращает ответ, когда совпадает URL-адрес запроса. Ему передаётся экземпляр обрабатываемой ошибки, которая, скорее всего, является HTTPException. Обработчик ошибок для «500 Внутренняя ошибка сервера» будет получать необработанные исключения в дополнение к явным ошибкам 500.
Обработчик ошибок регистрируется с помощью декоратора errorhandler() или метода register_error_handler(). Обработчик может быть зарегистрирован для кода состояния, например, 404, или для класса исключений.
Код состояния ответа не будет установлен в код обработчика. Убедитесь, что при возвращении ответа от обработчика указан соответствующий код HTTP-состояния.
Обработчик для «500 Внутренняя ошибка сервера» не будет использоваться при работе в режиме отладки. Вместо этого будет показан интерактивный отладчик.
Вот пример реализации для исключения «404 Страница не найдена»:
from flask import render_template
@app.errorhandler(404)
def page_not_found(e):
# note that we set the 404 status explicitly
return render_template('404.html'), 404
При использовании паттерна фабрики приложений:
from flask import Flask, render_template
def page_not_found(e):
return render_template('404.html'), 404
def create_app(config_filename):
app = Flask(__name__)
app.register_error_handler(404, page_not_found)
return app
Пример шаблона может быть таким:
{% extends "layout.html" %}
{% block title %}Page Not Found{% endblock %}
{% block body %}
<h1>Page Not Found</h1>
<p>What you were looking for is just not there.
<p><a href="{{ url_for('index') }}">go somewhere nice</a>
{% endblock %}
Возвращение API-ошибок в формате JSON
При использовании Flask для веб-API вы можете использовать те же методы, что и выше, для возвращения JSON-ответов на API-ошибки. abort() вызывается с параметром description. errorhandler() будет использовать это как сообщение об ошибке JSON и установит код состояния в 404.
from flask import abort, jsonify
@app.errorhandler(404)
def resource_not_found(e):
return jsonify(error=str(e)), 404
@app.route("/cheese")
def get_one_cheese():
resource = get_resource()
if resource is None:
abort(404, description="Resource not found")
return jsonify(resource)
© 2007–2020 Pallets
Licensed under the BSD 3-clause License.
https://flask.palletsprojects.com/en/1.0.x/patterns/errorpages/