2014-12-22 5 views
2

Я хочу, чтобы мои ответы об ошибках были действительны JSON, поэтому мой клиент может их проанализировать. В файлах флагов упоминаются коды статуса 404 и 500, которые были созданы внутренне, но я видел некоторые потоки о том, как он может также вернуть 405. Есть ли список кодов, которые я должен обработать фреймворком?Какие коды статуса поднимаются внутри Flask?

Я мог бы просто пройти и обрабатывать все коды состояния HTTP, но это выглядит немного тяжело для приложения Flask.

@app.errorhandler(500) 
def handle500error(error): 
    return json.dumps(dict(error_message="A serious error occurred.")), 500 

В качестве альтернативы существует ли общий способ обработки необработанных ошибок?

ответ

1

То, что я для вас все места, где исключения HTTP используются в термос и Werkzeug

$ ls 
# We have source code of Flask and Werkzeug in the folder 
flask-master werkzeug-master 

$ grep -oP "[A-Za-z]+(?=\(HTTPException\))" werkzeug-master/werkzeug/exceptions.py | paste -sd "|" - 
# Get a list of HTTP exceptions 
BadRequest|Unauthorized|Forbidden|NotFound|MethodNotAllowed|NotAcceptable|RequestTimeout|Conflict|Gone|LengthRequired|PreconditionFailed|RequestEntityTooLarge|RequestURITooLarge|UnsupportedMediaType|RequestedRangeNotSatisfiable|ExpectationFailed|ImATeapot|UnprocessableEntity|PreconditionRequired|TooManyRequests|RequestHeaderFieldsTooLarge|InternalServerError|NotImplemented|BadGateway|ServiceUnavailable|GatewayTimeout|HTTPVersionNotSupported 

$ grep -Prn "\b(`!!`)\(" * | grep -Pv "/(tests|docs|examples)/|class " 
# Search for these exceptions in source code, but exclude tests, docs, examples and definitions of those exception classes 
flask-master/flask/wrappers.py:178:  raise BadRequest() 
flask-master/flask/helpers.py:586:   raise NotFound() 
flask-master/flask/helpers.py:590:  raise NotFound() 
flask-master/flask/helpers.py:625:  raise NotFound() 
flask-master/flask/app.py:1471:   return InternalServerError() 
werkzeug-master/werkzeug/utils.py:504:     raise BadRequest('The browser failed to transmit all ' 
werkzeug-master/werkzeug/exceptions.py:20:   raise NotFound() 
werkzeug-master/werkzeug/serving.py:193:    execute(InternalServerError()) 
werkzeug-master/werkzeug/routing.py:1453:   raise MethodNotAllowed(valid_methods=list(have_match_for)) 
werkzeug-master/werkzeug/routing.py:1454:  raise NotFound() 
werkzeug-master/werkzeug/formparser.py:185:   raise exceptions.RequestEntityTooLarge() 
werkzeug-master/werkzeug/formparser.py:218:   raise exceptions.RequestEntityTooLarge() 
werkzeug-master/werkzeug/formparser.py:359:  raise exceptions.RequestEntityTooLarge() 
werkzeug-master/werkzeug/contrib/wrappers.py:56:   raise BadRequest('Not a JSON request') 
werkzeug-master/werkzeug/contrib/wrappers.py:60:   raise BadRequest('Unable to read JSON request') 
werkzeug-master/werkzeug/contrib/wrappers.py:82:   raise BadRequest('Not a Protobuf request') 
werkzeug-master/werkzeug/contrib/wrappers.py:88:   raise BadRequest("Unable to parse Protobuf request") 
werkzeug-master/werkzeug/contrib/wrappers.py:92:   raise BadRequest("Partial Protobuf request") 
2

Там нет никакого способа сделать это легко с декоратор однако есть атрибут в объектах приложения, которое легче манипулировать: error_handler_spec

Так способ сделать то, что вы хотите в коротком пути был бы как что:

from functools import partial 

def my_generic_handler(error, code=None): 
    return json.dumps(dict(error_message="A serious error occurred.")), code 

for code in range(400, 600): # All error statuses. And even more but it's ok for the sake of this example 
    app.error_handler_spec[None][code] = partial(my_generic_handler, code=code) 

Вот что здесь происходит. error_handler_spec - это dict, для которого первый уровень является планом (None = приложение), а второй уровень - это код или ошибка для обработки.

И частичный инструмент, который позволяет вам объявлять новые функции от других, подавать только часть параметров. Таким образом, вы можете создать общий обработчик для всех кодов состояния и создать специальные обработчики на лету.

Смежные вопросы