Python Falcon 中间件
一个 “中间件 “ 是一个函数,在每个请求(在被任何特定的响应者处理之前)和每个响应返回之前都会被处理。这个函数接收来到你的应用程序的每个请求。
中间件的工作与钩子类似。然而,与钩子不同的是,中间件方法适用于整个应用程序。它可以通过运行其中定义的代码对请求进行一些处理,然后把要处理的请求传递给相应的操作函数。它也可以在返回之前处理由操作函数产生的响应。
一个中间件是一个实现了一个或多个以下甚至处理方法的类。对于一个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协议下的请求,中间件可以定义以下coroutine方法:
- process_request_ws (self, req, ws) – 该方法在路由之前处理WebSocket握手请求。
-
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()])