Промежуточное ПО
Компоненты промежуточного ПО предоставляют способ выполнения логики до маршрутизации каждого запроса фреймворком, после маршрутизации каждого запроса, но перед вызовом целевого обработчика, или непосредственно перед возвратом ответа для каждого запроса. Компоненты регистрируются с помощью параметра 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–2017 by Rackspace Hosting, Inc. and other contributors
Licensed under the Apache License, Version 2.0.
https://falcon.readthedocs.io/en/1.4.1/api/middleware.html