Python Falcon - 中间件

"中间件" 是一个函数,它在每个请求(在被任何特定响应者处理之前)以及每个响应返回之前处理。 此函数接收应用程序收到的每个请求。

中间件的工作方式类似于 hooks。 但是,与 hooks 不同的是,中间件方法全局应用于整个 App。 它可以通过运行其中定义的代码对请求进行一些处理,然后将要处理的请求传递给相应的操作函数。 它还可以在返回之前处理操作函数生成的响应。

中间件是实现以下一个或多个事件处理程序方法的类。 对于 WSGI 应用程序,方法是 −

  • process_request (self, req, resp) − 此方法在路由之前处理请求。

  • process_resource (self, req, resp, resource, params) − 在路由之后处理请求。 可以传递表示从路由的 URI 模板字段派生的任何其他参数的 dict 对象。

  • process_response (self, req, resp, resource, req_succeeded) − 此方法用于对响应进行后处理(路由后)。 如果没有引发异常,则 req_succeeded 参数为 True,否则为 False。

对于ASGI应用,除了上述方法外,中间件类还可以定义更多的方法。

为了考虑生命周期事件,ASGI 规范的一个可选部分,可能包括启动和关闭事件处理程序。

  • process_startup (self, scope, event) − 此方法处理 ASGI 生命周期启动事件。 当服务器准备好启动和接收连接时调用它,但在它开始这样做之前。

  • process_shutdown(self, scope, event) − 此方法处理 ASGI 生命周期关闭事件。 当服务器停止接受连接并关闭所有活动连接时调用它。

由于ASGI应用也响应Websocket协议下的请求,中间件可以定义如下协程方法 −

  • process_request_ws (self, req, ws) − 此方法在路由之前处理 WebSocket 握手请求。

  • process_resource_ws (self, req, ws, resource, params) − 此方法在路由后处理 WebSocket 握手请求。 从路由的 URI 模板字段派生的字典对象可以传递给资源的响应者。

中间件类的实例必须在初始化时添加到 Falcon 应用程序对象中。 对于 WSGI Falcon 应用程序 −

class MyMiddleware:
   def process_request(self, req, resp):
      pass
   def process_resource(self, req, resp, resource, params):
      pass
   def process_response(self, req, resp, resource, req_succeeded):
      pass
from falcon import App
app=App(middleware=[MyMiddleware()])

对于 ASGI 应用程序 −

class MyMiddleware:
   async def process_startup(self, scope, event):
      pass
   async def process_shutdown(self, scope, event):
      pass
   async def process_request(self, req, resp):
      pass
   async def process_resource(self, req, resp, resource, params):
      pass
   async def process_response(self, req, resp, resource, req_succeeded):
      pass
   async def process_request_ws(self, req, ws):
      pass
   async def process_resource_ws(self, req, ws, resource, params):
      pass
from falcon.asgi import App
app=App(middleware=[MyMiddleware()])