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
![введите описание изображения здесь]()
Ответ 4
Вы также можете использовать Flask API и систему обработки ошибок:
http://www.flaskapi.org/api-guide/exceptions/