钩子

Falcon支架 之前之后 钩子。您只需将下面的一个装饰器应用到单个响应器或整个资源,就可以安装钩子。

例如,考虑验证图像资源的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(title='Bad request', description=msg)

你可以把这个钩子挂在 on_post 响应者喜欢这样:

@falcon.before(validate_image_type)
def on_post(self, req, resp):
    pass

或者,假设您有一个要申请的钩子 all 给定资源的响应程序。在这种情况下,您只需装饰资源类:

@falcon.before(extract_project_id)
class Message:
    def on_post(self, req, resp, project_id):
        pass

    def on_get(self, req, resp, project_id):
        pass

注解

在修饰整个资源类时,所有类似响应程序的方法名,包括 后缀 Ed(另见 add_route() )一个是装饰的。例如,如果调用了一个方法 on_get_items 但这不是为了处理 GET 路由下的请求 后缀 items ,防止将hook函数应用于方法的最简单的解决方法是重命名它,以避免与响应程序模式冲突。

还请注意,您可以根据需要向hook函数传递其他参数:

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(title='Bad request', description=msg)

@falcon.before(validate_image_type, ['image/png'])
def on_post(self, req, resp):
    pass

Falcon支持使用任何可调用的钩子。这允许使用类而不是函数:

class Authorize:
    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 components 也可以用于在请求前后插入逻辑。但是,与钩子不同, middleware components 被触发 全球地 所有请求。

小技巧

为了将数据从hook函数传递到资源函数,请使用 req.contextresp.context 物体。这些上下文对象用于在应用程序通过框架时保存特定于应用程序的请求和响应数据。

在钩子之前

falcon.before(action, *args, **kwargs)[源代码]

执行给定操作函数的装饰器 之前 响应者。

参数
  • action (callable) -- 形式的函数 func(req, resp, resource, params) 在哪里 resource 是对与请求关联的资源类实例的引用,并且 params 是URI模板字段名的dict,如果有的话,它将作为kwargs传递给资源响应程序。。注意:钩子可以根据需要注入额外的参数。例如::def do_something(req,resp,resource,params):try:params ['id'] =int(参数 ['id'] )异常值错误:升高falcon.HTTPBadRequest('Invalid ID','ID was not valid.')参数 ['回答'] =42个

  • *args -- 任何其他参数都将传递给 行动 按照给定的顺序,紧跟 reqresp资源帕拉姆 争论。

  • **kwargs -- 任何其他关键字参数都将传递给 行动 .

钩子后

falcon.after(action, *args, **kwargs)[源代码]

执行给定操作函数的装饰器 之后 响应者。

参数
  • action (callable) -- 形式的函数 func(req, resp, resource) 在哪里 resource 是对与请求关联的资源类实例的引用

  • *args -- 任何其他参数都将传递给 行动 按照给定的顺序,紧跟 reqresp资源帕拉姆 争论。

  • **kwargs -- 任何其他关键字参数都将传递给 行动 .