钩子¶
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.context
和 resp.context
物体。这些上下文对象用于在应用程序通过框架时保存特定于应用程序的请求和响应数据。
在钩子之前¶
- falcon.before(action, *args, is_async=False, **kwargs)[源代码]¶
执行给定的操作功能 在此之前 应答者。
这个 params 传递给挂接的参数只包含URI模板路径中的字段;它不包括查询字符串值。
钩子可以根据需要注入额外的参数。例如::
def do_something(req, resp, resource, params): try: params['id'] = int(params['id']) except ValueError: raise falcon.HTTPBadRequest(title='Invalid ID', description='ID was not valid.') params['answer'] = 42
- 参数:
action (callable) -- 表单的一个函数
func(req, resp, resource, params)
,在哪里 resource 是对与请求关联的资源类实例的引用,并且 params 是URI模板字段名的字典(如果有),它将作为kwargs传递给资源响应器。*args -- 任何其他参数都将传递给 行动 按照给定的顺序,紧跟 req , resp , 资源 和 帕拉姆 争论。
- 关键字参数:
is_async (bool) -- 设置为
True
让ASGI应用程序提供修饰的响应器是协程函数的提示(即,它是用async def
)或返回可等待的协程对象。通常,当使用async def
产生的函数对象被标记,以指示它在被调用时返回协程,并且这可以被自动检测到。但是,可以使用常规函数返回一个可等待的协程对象,在这种情况下,需要一个提示来让框架知道预期会发生什么。此外,在使用Cython化的协程函数时,始终需要提示,因为Cython不会以可以预先检测到的方式标记它们,即使函数是使用async def
。**kwargs -- 任何其他关键字参数都将传递给 行动 .
钩子后¶
- falcon.after(action, *args, is_async=False, **kwargs)[源代码]¶
执行给定的操作功能 之后 应答者。
- 参数:
action (callable) -- 形式的函数
func(req, resp, resource)
在哪里 resource 是对与请求关联的资源类实例的引用*args -- 任何其他参数都将传递给 动作 在给出的顺序中,紧跟在 req , resp 和 资源 争论。
- 关键字参数:
is_async (bool) -- 设置为
True
让ASGI应用程序提供修饰的响应器是协程函数的提示(即,它是用async def
)或返回可等待的协程对象。通常,当使用async def
产生的函数对象被标记,以指示它在被调用时返回协程,并且这可以被自动检测到。但是,可以使用常规函数返回一个可等待的协程对象,在这种情况下,需要一个提示来让框架知道预期会发生什么。此外,在使用Cython化的协程函数时,始终需要提示,因为Cython不会以可以预先检测到的方式标记它们,即使函数是使用async def
。**kwargs -- 任何其他关键字参数都将传递给 行动 .