跳转至

Cached Proxy

轻量级 HTTP 缓存代理服务器。用 Python 实现,支持响应内容修改和递归防循环。

https://github.com/CNSeniorious000/cached-proxy

Warning

这是一个周末 hack,代码简洁但功能实用。适合本地站点镜像或缓存。

功能

  • 代理 HTTP 请求,缓存响应
  • 修改响应内容,如替换域名
  • 支持递归代理和循环检测

实现

用 Python 写,依赖 pydantic 和 httpx。启动时设置 baseurl 和缓存时间,代理请求时检查缓存,必要时转发并缓存。

cached-proxy 把代理、缓存与响应改写做成了耦合良好的小工具:主程序用 httpx.AsyncClient(http2=True) 发起请求、把响应写入 diskcache 并通过 x-diskcache-hits/misses/age 等 header 报告缓存元数据(参见 main.py),decorate_body/decorate_headers 则负责把返回体或 Location 头内的 base URL 做可配置替换,方便做镜像或内嵌资源替换。递归抓取逻辑由 recursion.py 实现,使用 visited_urls 避免循环爬取。配置使用 pydantic/pydantic-settings 驱动(env.py 定义了 baseurl、min_age、replace 等字段),整体设计适合轻量站点镜像或开发时的缓存代理场景。

参考源码:main.py(httpx + diskcache + decorate_body) · recursion.py(visited_urls 防环) · env.py(pydantic settings)

我的巧思

  • 响应内容重写:用正则替换域名,实现自包含镜像。
  • 递归保护:跟踪 visited_urls,避免无限循环。
  • 轻量无依赖:除了 pydantic,几乎纯标准库。

相关项目

适合本地开发或简单代理需求。

深入洞见

这个项目是一个极简的 ASGI 反向代理,专注于缓存和重写单个上游网站。通过 diskcache 的 Blosc2 压缩实现高效存储,HTTpx 支持 HTTP/2。响应体重写使用简单字符串替换,适合静态站点,但对动态内容可能失效。预缓存爬虫使用 BeautifulSoup 递归抓取资源,限制并发和深度。依赖通过 Poetry 管理,Renovate 自动化更新。缓存统计头提供可观测性,但无驱逐策略可能导致磁盘增长。体现了高级 Python 实践,如 TypedDict 和懒导入。

参考源码:main.py(异步代理逻辑) · recursion.py(爬虫实现) · env.py(配置管理)