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,几乎纯标准库。
相关项目¶
- Exa-Networks/exaproxy:高性能非缓存代理。
- EpicWink/proxpi:PyPI 镜像代理。
- google/goblet:Git 缓存代理。
适合本地开发或简单代理需求。
深入洞见¶
这个项目是一个极简的 ASGI 反向代理,专注于缓存和重写单个上游网站。通过 diskcache 的 Blosc2 压缩实现高效存储,HTTpx 支持 HTTP/2。响应体重写使用简单字符串替换,适合静态站点,但对动态内容可能失效。预缓存爬虫使用 BeautifulSoup 递归抓取资源,限制并发和深度。依赖通过 Poetry 管理,Renovate 自动化更新。缓存统计头提供可观测性,但无驱逐策略可能导致磁盘增长。体现了高级 Python 实践,如 TypedDict 和懒导入。
参考源码:main.py(异步代理逻辑) · recursion.py(爬虫实现) · env.py(配置管理)