Среднее ПО
Компоненты среднего ПО предоставляют способ выполнения логики до обработки каждого запроса фреймворком, после того, как каждый запрос был обработан, но перед вызовом целевого обработчика, или непосредственно перед возвратом ответа для каждого запроса. Компоненты регистрируются с помощью параметра middleware при создании класса API Falcon.
Примечание
В отличие от хуков, методы среднего ПО применяются глобально ко всему API.
Интерфейс среднего ПО Falcon определен следующим образом:
class ExampleComponent(object):
def process_request(self, req, resp):
"""Process the request before routing it.
Args:
req: Request object that will eventually be
routed to an on_* responder method.
resp: Response object that will be routed to
the on_* responder.
"""
def process_resource(self, req, resp, resource, params):
"""Process the request after routing.
Note:
This method is only called when the request matches
a route to a resource.
Args:
req: Request object that will be passed to the
routed responder.
resp: Response object that will be passed to the
responder.
resource: Resource object to which the request was
routed.
params: A dict-like object representing any additional
params derived from the route's URI template fields,
that will be passed to the resource's responder
method as keyword arguments.
"""
def process_response(self, req, resp, resource, req_succeeded):
"""Post-processing of the response (after routing).
Args:
req: Request object.
resp: Response object.
resource: Resource object to which the request was
routed. May be None if no route was found
for the request.
req_succeeded: True if no exceptions were raised while
the framework processed and routed the request;
otherwise False.
"""
Подсказка
Поскольку process_request выполняется до обработки маршрута, если компонент изменяет req.path в методе process_request, фреймворк будет использовать измененное значение для маршрутизации запроса.
Подсказка
Метод process_resource вызывается только тогда, когда запрос соответствует маршруту к ресурсу. Чтобы предпринять действия, когда маршрут не найден, можно использовать sink вместо этого.
Методы process_request, process_resource и process_response каждого компонента выполняются иерархически, как стек, следуя порядку списка, переданного через параметр middleware класса falcon.API. Например, если в качестве [mob1, mob2, mob3] передается список объектов среднего ПО, порядок выполнения следующий:
mob1.process_request
mob2.process_request
mob3.process_request
mob1.process_resource
mob2.process_resource
mob3.process_resource
<route to responder method>
mob3.process_response
mob2.process_response
mob1.process_response
Обратите внимание, что каждый компонент не обязан реализовывать все process_* методы; в случае отсутствия одного из трех методов он обрабатывается как ничто в стеке. Например, если mob2 не реализовал process_request, а mob3 не реализовал process_response, порядок выполнения будет выглядеть так:
mob1.process_request
_
mob3.process_request
mob1.process_resource
mob2.process_resource
mob3.process_resource
<route to responder method>
_
mob2.process_response
mob1.process_response
Если один из методов process_request среднего ПО вызывает ошибку, она обрабатывается в соответствии с типом ошибки. Если тип соответствует зарегистрированному обработчику ошибок, этот обработчик будет вызван, после чего фреймворк начнет разворачивать стек, пропуская нижние слои. Обработчик ошибок сам может вызвать экземпляр HTTPError, в этом случае фреймворк использует последнюю ошибку для обновления объекта resp. В любом случае фреймворк продолжит разворачивать стек среднего ПО. Например, если mob2.process_request вызовет ошибку, фреймворк выполнит стек следующим образом:
mob1.process_request
mob2.process_request
<skip mob1/mob2 process_resource, mob3, and routing>
mob2.process_response
mob1.process_response
Наконец, если один из методов process_response вызывает ошибку или сам метод обработчика on_*, вызванный по маршруту, вызывает ошибку, исключение будет обработано аналогичным образом, как описано выше. Затем фреймворк выполнит все оставшиеся компоненты среднего ПО в стеке.
© 2012–2016 by Rackspace Hosting, Inc. and other contributors
Licensed under the Apache License, Version 2.0.
https://falcon.readthedocs.io/en/1.3.0/api/middleware.html