Flask - Как создать пользовательский код abort()?

Флажок имеет хороший обработчик ошибок, используя abort() или когда ошибка действительно произошла.

Из документации Flask приведен пример для обработчика ошибок 404:

@app.errorhandler(404)
def not_found(error):
    return render_template('404.html'), 404

Итак, я попытался создать собственный код ошибки, например

if False:
    abort(777)

@app.errorhandler(777)
def something_is_wrong(error):
    return render_template('777.html'), 777

Но это не сработает, и отладчик Werkzeug говорит: LookupError: исключение для 777

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

if False:
    return '777 error', 777

К сожалению, приведенный выше код создает белый экран, даже отладчик Werkzeug не выходит

Я знаю, что могу просто сделать:

if False:
    return render_template('777.html')

Но это сделает код более чистым, если я использую abort(). Есть ли способ создать собственный код ошибки?

Ответы

Ответ 1

Список возможных кодов состояния HTTP фиксируется авторитетом Internet Assigned Numbers, поэтому вы не можете добавить пользовательский. Werkzeug это признает и пытается остановить отправку бессмысленного кода в браузер. Просмотрите список кодов состояния, чтобы найти ту, которая соответствует вашей ошибке, и используйте ее.

Изменить: Добавление кодов состояния в Werkzeug/Flask

import werkzeug.exceptions as ex
from flask import Flask, abort

class PaymentRequired(ex.HTTPException):
    code = 402
    description = '<p>You will pay for this!</p>'

abort.mappings[402] = PaymentRequired

app = Flask(__name__)

@app.route('/')
def mainpage():
    abort(402)

@app.errorhandler(402)
def payme(e):
    return 'Pay me!'

app.run()

Ответ 2

В зависимости от чтения вопроса это может пригодиться.

Существует более простой способ добавить обработку страницы ошибок клиента для конкретного исключения, вы можете сделать это:

class MyCustom404(Exception):
    pass

@app.errorhandler(404)
def page_not_found(error):
    return render_template("errors/404.html"), 404

@app.errorhandler(MyCustom404)
def special_page_not_found(error):
    return render_template("errors/custom_404.html"), 404

... затем запускайте новый обработчик, когда вам это нужно, с помощью

raise MyCustom404

Смотрите документы здесь.

Ответ 3

В моем случае Flask == 0.11.1 Werkzeug == 0.11.10

Я использую, например, прервать код статуса http 451.

если вы хотите использовать abort() с кодом, int number, например abort (451), сначала вы должны создать настраиваемое HTTPException, подкласс HTTPException.and добавить HTTPException к default_exceptions.

from werkzeug.exceptions import HTTPException, default_exceptions,  Aborter
class UnavailableForLegalReasons(HTTPException):
    code = 451
    description = 'BIG BROTHER IS WATCHING YOU'

default_exceptions[451] = UnavailableForLegalReasons
abort = Aborter()  # don't from flask import abort

@app.errorhandler(451)
def uflr(e):
    return e, 451

@app.route('/debug')
def debug():
    abort(451)

то при доступе к пути в браузере вы можете посмотреть это введите описание изображения здесь

но фраза http-причины НЕИЗВЕСТНА,

вы можете изменить его

from werkzeug.http import HTTP_STATUS_CODES
HTTP_STATUS_CODES[451] = 'Unavailable For Legal Reasons'  # or even empty

введите описание изображения здесь