Обработчики
Falcon поддерживает обработчики before и after. Вы устанавливаете обработчик, просто применив один из декораторов ниже, либо к отдельному обработчику, либо к целому ресурсу.
Например, рассмотрим этот обработчик, который валидирует POST-запрос для ресурса изображения:
def validate_image_type(req, resp, resource, params):
if req.content_type not in ALLOWED_IMAGE_TYPES:
msg = 'Image type not allowed. Must be PNG, JPEG, or GIF'
raise falcon.HTTPBadRequest('Bad request', msg)
Вы бы прикрепили этот обработчик к on_post обработчику следующим образом:
@falcon.before(validate_image_type)
def on_post(self, req, resp):
pass
Или, предположим, у вас есть обработчик, который вы хотели бы применить ко всем обработчикам для данного ресурса. В этом случае вы просто добавите декоратор к классу ресурса:
@falcon.before(extract_project_id)
class Message(object):
def on_post(self, req, resp, project_id):
pass
def on_get(self, req, resp, project_id):
pass
Примечание
При добавлении декоратора ко всему классу ресурса, все имена методов, которые похожи на обработчики, включая те, что с суффиксом (см. также add_route()), будут добавлены в обработчики. Если, например, метод называется on_get_items, но он не предназначен для обработки GET запросов по маршруту с суффиксом items, то самым простым способом предотвращения применения функции обработчика к методу является переименование его таким образом, чтобы он не совпадал с шаблоном обработчика.
Обратите также внимание, что вы можете передавать дополнительные аргументы в свою функцию обработчика по мере необходимости:
def validate_image_type(req, resp, resource, params, allowed_types):
if req.content_type not in allowed_types:
msg = 'Image type not allowed.'
raise falcon.HTTPBadRequest('Bad request', msg)
@falcon.before(validate_image_type, ['image/png'])
def on_post(self, req, resp):
pass
Falcon поддерживает использование любого вызываемого объекта в качестве обработчика. Это позволяет использовать класс вместо функции:
class Authorize(object):
def __init__(self, roles):
self._roles = roles
def __call__(self, req, resp, resource, params):
pass
@falcon.before(Authorize(['admin']))
def on_post(self, req, resp):
pass
Falcon компоненты middleware также могут использоваться для вставки логики до и после запросов. Однако, в отличие от обработчиков, компоненты middleware срабатывают глобально для всех запросов.
Подсказка
Для передачи данных из функции обработчика в функцию ресурса используйте объекты req.context и resp.context. Эти контекстные объекты предназначены для хранения данных запроса и ответа, специфичных для вашего приложения, по мере его прохождения через фреймворк.
-
falcon.before(action, *args, **kwargs)[source] -
Декоратор для выполнения заданной функции действия до обработчика.
Параметры: -
action (callable) –
Функция вида
func(req, resp, resource, params), гдеresource— ссылка на экземпляр класса ресурса, связанный с запросом, аparams— словарь имён полей шаблона URI, если таковые имеются, которые будут переданы в обработчик ресурса в качестве kwargs.Примечание
Обработчики могут вводить дополнительные параметры по мере необходимости. Например:
def do_something(req, resp, resource, params): try: params['id'] = int(params['id']) except ValueError: raise falcon.HTTPBadRequest('Invalid ID', 'ID was not valid.') params['answer'] = 42 - *args – Любые дополнительные аргументы будут переданы в action в заданном порядке, сразу после аргументов req, resp, resource и params.
- **kwargs – Любые дополнительные ключевые аргументы будут переданы в action.
-
action (callable) –
-
falcon.after(action, *args, **kwargs)[source] -
Декоратор для выполнения заданной функции действия после обработчика.
Параметры: -
action (callable) – Функция вида
func(req, resp, resource), гдеresource— ссылка на экземпляр класса ресурса, связанный с запросом - *args – Любые дополнительные аргументы будут переданы в action в заданном порядке, сразу после аргументов req, resp, resource и params.
- **kwargs – Любые дополнительные ключевые аргументы будут переданы в action.
-
action (callable) – Функция вида
© 2019 by Falcon contributors
Licensed under the Apache License, Version 2.0.
https://falcon.readthedocs.io/en/2.0.0/api/hooks.html