Как я могу реализовать собственный обработчик ошибок для всех ошибок HTTP в Flask?

В моем приложении Flask я могу легко расширить список ошибок, обрабатываемых одним настраиваемым обработчиком ошибок, добавив декораторы обработчиков errorhandler для каждого кода ошибки, как в случае с

 @application.errorhandler(404) @application.errorhandler(401) @application.errorhandler(500) def http_error_handler(error): return flask.render_template('error.html', error=error), error.code 

Однако для этого подхода требуется явный декоратор для каждого кода ошибки. Есть ли способ украсить мою (единственную) функцию http_error_handler чтобы она обрабатывала все ошибки HTTP?

  • Jython @property СинтаксисError: несоответствующий вход '' ожидающий CLASS
  • Как вставить переменную в область с помощью декоратора в python
  • Флакон: Декоратор для проверки схемы JSON и JSON
  • Как пропустить pytest с помощью внешнего прибора?
  • метод сеттера декоратора свойств, который не называется
  • Проверьте, использует ли функция @classmethod
  • как сделать условный декоратор в python 2.6
  • Пример реального мира о том, как использовать свойство свойства в python?
  • 3 Solutions collect form web for “Как я могу реализовать собственный обработчик ошибок для всех ошибок HTTP в Flask?”

    Вы не единственный, один обходной путь будет указывать список кода ошибки http, который вы ловите, и привязан к application.error_handler_spec , и оставьте декораторы, например:

     def http_error_handler(error): return flask.render_template('error.html', error=error), error.code for error in (401, 404, 500): # or with other http code you consider as error application.error_handler_spec[None][error] = http_error_handler 

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

    Вы можете использовать декоратор errorhandler с классом исключений, а не код ошибки в качестве аргумента, как описано здесь . Таким образом, вы можете попробовать например

     @application.errorhandler(HTTPException) def http_error_handler(error): 

    для обработки всех ошибок HTTP (которые предположительно означают все коды ошибок HTTP) или даже

     @application.errorhandler(Exception) def http_error_handler(error): 

    обрабатывать все неперехваченные исключения

    Редактирование. Посмотрев на исходный код флешки, в конфигурации приложения есть флаг TRAP_HTTP_EXCEPTIONS, который вы можете изменить (например, app.config['TRAP_HTTP_EXCEPTIONS']=True ).

    (Грубо) Когда этот флаг является ложным, исключения, которые являются экземплярами HTTPException, обрабатываются функциями, которые вы украсили с помощью errorhandler(n) где n – код ошибки HTTP; и когда этот флаг верен, все экземпляры HTTPException вместо этого обрабатываются функциями, которые вы украсили с помощью errorhandler(c) , где c – класс исключений.

    Таким образом,

     app.config['TRAP_HTTP_EXCEPTIONS']=True @application.errorhandler(Exception) def http_error_handler(error): 

    должен достичь того, чего вы хотите.

    Поскольку HTTPException имеет подклассы для каждого кода ошибки HTTP (см. Здесь ), установка «TRAP_HTTP_EXCEPTIONS» и украшение обработчиков ошибок классами исключений, а не коды ошибок, выглядит как более гибкий способ делать что-то.

    Для справки, моя обработка ошибок в колбе теперь выглядит так:

     app.config['TRAP_HTTP_EXCEPTIONS']=True @app.errorhandler(Exception) def handle_error(e): try: if e.code < 400: return flask.Response.force_type(e, flask.request.environ) elif e.code == 404: return make_error_page("Page Not Found", "The page you're looking for was not found"), 404 raise e except: return make_error_page("Error", "Something went wrong"), 500 

    Это делает все, что я хочу, и, похоже, обрабатывает все ошибки, как HTTP, так и внутренние. if e.code < 400 бит используется, чтобы использовать поведение по умолчанию для if e.code < 400 для переадресаций и т. Д. (В противном случае они заканчиваются ошибкой 500, что не то, что вы хотите)

    Для меня следующие фрагменты не работали:

     @app.errorhandler(HTTPException) def _handle_http_exception(e): return make_response(render_template("errors/http_exception.html", code=e.code, description=e.description), e.code) 

    Но смена HTTPException на реальную, например NotFound , работала. Не спрашивайте меня, почему я не нашел ответа.

    Поэтому я нашел альтернативное решение, которое работает очень хорошо:

     from werkzeug.exceptions import default_exceptions def _handle_http_exception(e): return make_response(render_template("errors/http_exception.html", code=e.code, description=e.description), e.code) for code in default_exceptions: app.errorhandler(code)(_handle_http_exception) 

    (Найдено в Github )

    Python - лучший язык программирования в мире.