You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 03:15:03