如何在Falcon应用中拦截静态路由并添加请求前置执行函数
FastAPI/Starlette 框架实现方案
你可以通过HTTP中间件拦截指定前缀的GET请求,执行上报逻辑后再处理静态文件返回:
from fastapi import FastAPI, Request app = FastAPI() # 自定义Matomo上报函数 def report_to_matomo(request: Request): # 按需提取上报字段,示例如下: report_data = { "client_ip": request.client.host, "user_agent": request.headers.get("user-agent", ""), "request_path": request.url.path, "request_method": request.method } # 这里补充调用Matomo上报接口的逻辑,耗时操作建议丢到后台任务避免阻塞请求 # 注册前置拦截中间件 @app.middleware("http") async def artifacts_interceptor(request: Request, call_next): # 仅匹配/artifacts/前缀的GET请求 if request.method == "GET" and request.url.path.startswith("/artifacts/"): report_to_matomo(request) # 继续执行后续的静态文件处理逻辑 response = await call_next(request) return response # 原有的静态路由配置保持不变 app.add_static_route('/artifacts/', '/artifacts/')
Flask 框架实现方案
你可以通过before_request钩子做路径匹配拦截:
from flask import Flask, request app = Flask(__name__) # 自定义Matomo上报函数 def report_to_matomo(): report_data = { "client_ip": request.remote_addr, "user_agent": request.user_agent.string, "request_path": request.path } # 补充Matomo上报逻辑 # 注册前置钩子 @app.before_request def intercept_artifacts_get(): if request.method == "GET" and request.path.startswith("/artifacts/"): report_to_matomo() # 原有的静态路由配置保持不变 app.add_static_route('/artifacts/', '/artifacts/')
注意事项
- 上报逻辑如果涉及网络IO耗时较长,建议用异步任务、后台线程的方式执行,不要阻塞静态文件的返回,避免影响用户下载体验
- 如果你需要排除部分子路径的上报,直接在路径匹配的判断条件中补充排除规则即可
- 可以按需从请求上下文、URL参数、请求头中提取你需要上报到Matomo的自定义字段,比如用户标识、构件版本等信息
内容的提问来源于stack exchange,提问作者Ebsan
相关产品推荐
相关产品推荐

