Spaces:
Sleeping
Sleeping
File size: 6,909 Bytes
8704848 954be92 8f1571b 954be92 8f1571b 954be92 8f1571b 954be92 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 |
---
title: Exchange Rates Service
emoji: 💱
colorFrom: blue
colorTo: green
sdk: docker
pinned: false
license: mit
---
# 💱 汇率换算服务
基于 Python + FastAPI 开发的实时汇率换算服务,支持多 API Key 轮询、数据缓存、实时换算等功能。
## ✨ 功能特性
- 🔄 **多 API Key 轮询** - 支持配置多个 API Key,自动轮询切换,防止单个 Key 超限
- 💾 **智能缓存** - 定时任务自动更新汇率数据,避免频繁请求 API
- 🌍 **161 种货币** - 支持全球 161 种货币的汇率查询和换算
- 💱 **实时换算** - 前端页面支持实时输入实时计算,用户体验流畅
- 🎨 **美观界面** - 响应式设计,支持搜索过滤,常用货币优先展示
- 📊 **RESTful API** - 提供完整的 API 接口,支持第三方集成
## 🛠️ 技术栈
- **后端**: Python 3.9+, FastAPI, Uvicorn
- **定时任务**: APScheduler
- **HTTP 客户端**: httpx
- **数据验证**: Pydantic
- **日志**: Loguru
- **前端**: 原生 HTML/CSS/JavaScript
## 📁 项目结构
```
exchangeRates/
├── app/
│ ├── __init__.py
│ ├── main.py # FastAPI 应用入口
│ ├── config.py # 配置管理
│ ├── models.py # 数据模型
│ ├── api/
│ │ ├── __init__.py
│ │ └── routes.py # API 路由
│ ├── services/
│ │ ├── __init__.py
│ │ ├── exchange_service.py # 汇率服务核心
│ │ └── scheduler.py # 定时任务
│ └── utils/
│ ├── __init__.py
│ ├── logger.py # 日志工具
│ └── currency_names.py # 货币名称映射
├── static/
│ ├── css/
│ │ └── style.css # 样式文件
│ └── js/
│ └── app.js # 前端交互
├── templates/
│ └── index.html # 前端页面
├── .env # 环境变量配置
├── .env.example # 环境变量示例
├── requirements.txt # Python 依赖
├── run.py # 启动脚本
└── README.md # 项目说明
```
## 🚀 快速开始
### 本地部署
#### 1. 克隆项目
```bash
cd C:\Users\Eleven\Desktop\exchangeRates
```
### 2. 创建虚拟环境
```bash
python -m venv .venv
.venv\Scripts\activate
```
### 3. 安装依赖
```bash
pip install -r requirements.txt
```
### 4. 配置环境变量
编辑 `.env` 文件,配置你的 API Key:
```env
# 多个 API Key 用逗号分隔
API_KEYS=your_api_key_1,your_api_key_2
# 基准货币
BASE_CURRENCY=CNY
# 缓存更新间隔(秒)
CACHE_UPDATE_INTERVAL=3600
```
### 5. 启动服务
```bash
python run.py
```
或者使用 uvicorn 直接启动:
```bash
uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
```
### 6. 访问服务
- 🌐 **首页**: http://localhost:8000
- 📚 **API 文档**: http://localhost:8000/docs
- 📖 **ReDoc**: http://localhost:8000/redoc
### Hugging Face Spaces 部署
本项目支持一键部署到 Hugging Face Spaces。
#### 1. 创建 README.md 头部配置
在项目根目录的 README.md 文件顶部添加以下 YAML 配置:
```yaml
---
title: Exchange Rates Service
emoji: 💱
colorFrom: blue
colorTo: green
sdk: docker
pinned: false
license: mit
---
```
#### 2. 创建 Dockerfile
项目需要包含 Dockerfile 用于 Spaces 部署:
```dockerfile
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 7860
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "7860"]
```
#### 3. 配置环境变量
在 Hugging Face Spaces 设置中添加 Secrets:
- `API_KEYS`: 你的 ExchangeRate-API Keys(逗号分隔)
- `BASE_CURRENCY`: 基准货币(默认 CNY)
- `CACHE_UPDATE_INTERVAL`: 缓存更新间隔(默认 3600)
#### 4. 部署步骤
1. 在 [Hugging Face](https://huggingface.co/) 创建新的 Space
2. 选择 Docker SDK
3. 上传项目文件或连接 Git 仓库
4. 在 Settings 中配置 Secrets
5. Space 将自动构建和部署
#### 5. 访问服务
部署成功后,可通过 `https://huggingface.co/spaces/YOUR_USERNAME/YOUR_SPACE_NAME` 访问服务。
## 📡 API 接口
### 获取所有汇率
```http
GET /api/rates
```
响应示例:
```json
{
"success": true,
"base_currency": "CNY",
"rates": {
"USD": 0.1413,
"EUR": 0.1212,
...
},
"last_update": "Fri, 05 Dec 2025 00:00:01 +0000",
"cached_at": "2025-12-05T10:30:00",
"currencies_count": 161
}
```
### 获取特定货币汇率
```http
GET /api/rates/{currency}
```
示例:`GET /api/rates/USD`
### 货币换算
```http
POST /api/convert
Content-Type: application/json
{
"from_currency": "USD",
"to_currency": "CNY",
"amount": 100
}
```
或使用 GET 方式:
```http
GET /api/convert/USD/CNY?amount=100
```
### 批量换算
```http
POST /api/batch-convert
Content-Type: application/json
{
"base_currency": "USD",
"amount": 100
}
```
或使用 GET 方式:
```http
GET /api/batch-convert/USD?amount=100
```
### 获取货币列表
```http
GET /api/currencies
```
### 服务状态
```http
GET /api/status
```
### 强制刷新缓存
```http
POST /api/refresh
```
## ⚙️ 配置说明
| 配置项 | 说明 | 默认值 |
|--------|------|--------|
| API_KEYS | API Key 列表(逗号分隔) | - |
| BASE_CURRENCY | 基准货币 | CNY |
| CACHE_UPDATE_INTERVAL | 缓存更新间隔(秒) | 3600 |
| REQUEST_TIMEOUT | 请求超时时间(秒) | 10 |
| MAX_RETRIES | 最大重试次数 | 3 |
| SERVER_PORT | 服务端口 | 8000 |
### Hugging Face Spaces 配置参数
| 参数 | 说明 | 示例值 |
|------|------|--------|
| sdk | SDK 类型 | docker |
| app_port | 应用端口(Spaces 默认 7860) | 7860 |
| title | Space 标题 | Exchange Rates Service |
| emoji | Space 图标 | 💱 |
| colorFrom | 渐变起始色 | blue |
| colorTo | 渐变结束色 | green |
| pinned | 是否固定在个人主页 | false |
| license | 开源协议 | mit |
## 🔑 API Key 获取
1. 访问 [ExchangeRate-API](https://www.exchangerate-api.com/)
2. 注册账号(免费版每月 1500 次请求)
3. 获取 API Key
4. 配置到 `.env` 文件中
建议配置 3-5 个 API Key 以实现轮询,避免单个 Key 超限。
## 📝 注意事项
1. **API 限制**: 免费版 API 每月 1500 次请求,请合理设置缓存更新间隔
2. **缓存策略**: 汇率数据每日更新一次(UTC 00:00),建议缓存间隔设为 1 小时
3. **Key 管理**: 系统自动管理 Key 状态,失败的 Key 会进入冷却期
4. **错误处理**: API 请求失败时会自动重试并切换 Key
## 🤝 贡献
欢迎提交 Issue 和 Pull Request!
## 📄 许可证
MIT License
|