Spec-Zone.ru › Falcon 1.2

Прослойки

Компоненты прослойки предоставляют способ выполнить логику до того, как фреймворк обработает каждый запрос, после того, как каждый запрос будет обработан, но перед вызовом целевого обработчика, или непосредственно перед возвратом ответа для каждого запроса. Компоненты регистрируются с помощью параметра 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_* методы; в случае отсутствия одного из трёх методов он обрабатывается как noop в стеке. Например, если 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.2.0/api/middleware.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API