你写了一个好用的 Python 脚本,想分享给别人用?本文记录我把汇率查询脚本升级成 API + 网页的全过程。
一、原来:一个命令行脚本
我手头有一个查询美元兑人民币汇率的 Python 脚本,效果是这样的:
$ python usd-cny-boc.py============================================================ USD/CNY Exchange Rate Query (Bank of China)============================================================ Query period: 2026-06-06 to 2026-06-12 2026-06-06 -> 7.2341 2026-06-07 -> 7.2289 ... Lowest rate: 2026-06-07 -> 7.2289
自己用着挺爽,但想分享给别人时问题来了:
传统解决方案的局限:
我需要的是一个:普通人能网页查,程序员能接口调的服务。
二、FastAPI:三步封装成 API
第一步:安装依赖
pip install fastapi uvicorn
第二步:写 API 代码
from fastapi import FastAPI, Queryfrom typing importOptionalapp = FastAPI(title="USD/CNY Exchange Rate API")@app.get("/api/rates")defget_rates( date: Optional[str] = Query(None, description="查询日期"), days: int = Query(7, ge=1, le=30, description="查询天数")):"""查询美元兑人民币汇率"""# ... 查询逻辑 ...return {"rates": [...],"lowest_rate": {...},"summary": {...} }
第三步:启动服务
python main.py
服务运行在 http://localhost:8000[1]
三、API 的三种用法
用法一:普通人 → 网页查询
打开浏览器,访问 http://localhost:8000
界面特点:
不需要懂代码,不需要装任何软件,有浏览器就能用。
用法二:程序员 → 接口调试
访问 http://localhost:8000/docs
Swagger UI 自动生成:
用法三:程序调用 → 一行代码
# curl 命令行curl "http://localhost:8000/api/rates?days=7"
# Python requestsimport requestsresponse = requests.get("http://localhost:8000/api/rates?days=7")data = response.json()for rate in data["rates"]:print(f"{rate['date']}: {rate['rate']}")
// JavaScript fetchfetch("http://localhost:8000/api/rates?days=7") .then(r => r.json()) .then(data =>console.log(data.lowest_rate));
四、技术亮点
4.1 一个服务,三种界面
4.2 自动数据校验
@app.get("/api/rates")defget_rates( days: int = Query(7, ge=1, le=30) # 自动限制 1-30 天):
输入超出范围?自动返回 422 错误,不需要手写校验。
4.3 自动生成文档
写代码时加注释:
defget_rates( date: Optional[str] = Query(None, description="查询日期 (YYYY-MM-DD)")):"""查询美元兑人民币汇率"""
文档自动生成,零维护成本。
五、部署上线
Docker 部署
FROM python:3.11-slimWORKDIR /appCOPY requirements.txt .RUN pip install -r requirements.txtCOPY main.py .CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
docker build -t exchange-rate-api .docker run -p 8000:8000 exchange-rate-api
云服务器部署
# 使用 systemd 守护进程sudo systemctl enable exchange-apisudo systemctl start exchange-api
六、给你的脚本做 API 的 checklist
□ 把核心逻辑抽成函数(不依赖 print/input)□ 用 FastAPI 创建应用和端点□ 用 Pydantic 定义数据模型(自动校验)□ 添加参数说明和文档字符串□ 处理错误(返回标准 HTTP 状态码)□ 写个简单网页给普通人用□ 启用 CORS(让前端能调用)□ 写 README(告诉别人怎么用)□ 测试所有端点□ Docker 打包部署
七、总结
核心转变:
- 从
sys.argv 到 Query Parameters
八、完整代码
本文完整代码已整理:
- 包含:main.py + requirements.txt + README.md + Dockerfile
你也有想分享的脚本?试试封装成 API 吧!
有问题欢迎在评论区交流 👇