Python Falcon 简明教程

Python Falcon - Middleware

"middleware" 是一个函数,用它来处理每个请求(在由任何特定响应程序处理之前),以及在返回每个响应之前。此函数会处理发送到应用程序的每个请求。

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

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

  1. process_request (self, req, resp) - 此方法在将请求路由之前对其进行处理。

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

  3. process_response (self, req, resp, resource, req_succeeded) - 此方法用于响应后处理(路由后)。如果未引发异常,则 req_succeeded 参数为 True,否则为 False。

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

为了考虑 ASGI 规范的可选部分寿命事件,可以包括启动和关闭事件处理程序。

  1. process_startup (self, scope, event) - 此方法处理 ASGI 寿命启动事件。当服务器准备好启动并接受连接时调用它,但在开始这样做之前。

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

由于 ASGI 应用程序还响应 Websocket 协议下的请求,因此中间件可以定义以下协程方法:

  1. process_request_ws (self, req, ws) - 此方法在将 WebSocket 握手请求路由之前对其进行处理。

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

中间件类的实例必须在初始化时添加到 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()])