# API 视图文档
## 📋 **目录**
### 1. [GetIPDataView](#getipdataview)
### 2. [BaiduFanyiView](#baidufanyiview)
### 3. [用户视图](#user-views)
---
## 🌐 GetIPDataView
### **文件位置**
`api/views/GetIPDataView.py`
### **概述**
从各种 HTTP 头部和服务器变量中获取客户端 IP 地址信息。
### **类详情**
```python
@permission_classes([AllowAny])
class GetIPDataView(APIView):
def get(self, request):
# 实现...
```
### **方法: GET**
#### **参数**
- 无需参数
#### **响应格式**
```json
{
"ip_info": {
"remote_addr": "字符串",
"http_x_forwarded_for": "字符串",
"http_x_real_ip": "字符串",
"http_client_ip": "字符串",
"http_x_forwarded": "字符串",
"http_x_cluster_client_ip": "字符串",
"http_forwarded_for": "字符串",
"http_forwarded": "字符串"
}
}
```
#### **检查的HTTP头部**
该视图从以下 HTTP 头部提取 IP 信息:
| 头部名称 | 映射变量 | 描述 |
|---------|----------|------|
| `REMOTE_ADDR` | `request.META.get('REMOTE_ADDR')` | 直接连接 IP(最可靠) |
| `X-Forwarded-For` | `request.META.get('HTTP_X_FORWARDED_FOR')` | 代理/负载均衡器转发 IP |
| `X-Real-IP` | `request.META.get('HTTP_X_REAL_IP')` | 反向代理看到的真实客户端 IP |
| `Client-Ip` | `request.META.get('HTTP_CLIENT_IP')` | 客户端 IP 头部 |
| `X-Forwarded` | `request.META.get('HTTP_X_FORWARDED')` | 转发头部 |
| `X-Cluster-Client-Ip` | `request.META.get('HTTP_X_CLUSTER_CLIENT_IP')` | 集群客户端 IP |
| `Forwarded-For` | `request.META.get('HTTP_FORWARDED_FOR')` | 标准转发 for 头部 |
| `Forwarded` | `request.META.get('HTTP_FORWARDED')` | 标准转发头部 |
### **使用示例**
```bash
curl -X GET http://your-api.com/api/get-ip-data/
```
**响应:**
```json
{
"ip_info": {
"remote_addr": "192.168.1.100",
"http_x_forwarded_for": "203.0.113.50, 198.51.100.25",
"http_x_real_ip": "203.0.113.50",
"http_client_ip": "",
"http_x_forwarded": "",
"http_x_cluster_client_ip": "",
"http_forwarded_for": "",
"http_forwarded": ""
}
}
```
### **错误处理**
- 返回 HTTP 200,缺失头部返回空字符串
- 无需认证 (`@permission_classes([AllowAny])`)
---
## 🌍 BaiduFanyiView
### **文件位置**
`api/views/BaiduFanyiView.py`
### **概述**
使用百度翻译 API 提供翻译和语言识别服务。所有视图都已转换为异步操作以获得更好的 Daphne ASGI 服务器性能。
### **类详情**
```python
# 所有视图的异步方法
async def post(self, request): # 文本和语言识别
async def post(self, request): # 图片翻译
async def post(self, request): # 语音识别
```
### **1. BaiduFanyiView (文本翻译)**
#### **端点**: `POST /api/translate/`
##### **参数**
```json
{
"q": "要翻译的文本", // 必需:文本内容(最多 3000 字符)
"from_lang": "en", // 必需:源语言代码
"to_lang": "zh" // 必需:目标语言代码
}
```
##### **支持的语言**
从 `info.baidu_lang_info` 加载语言:
- 查看 `languages` 获取支持的语言对
- 使用 `"auto"` 自动检测源语言
##### **响应示例**
```json
{
"message": "Success",
"code": "10000",
"data": {
"trans_result": [
{
"src": "Hello world",
"dst": "你好世界"
}
],
"from": "en",
"to": "zh"
}
}
```
### **2. RecognizeLangTypeViews (语言识别)**
#### **端点**: `POST /api/recognize-language/`
##### **参数**
```json
{
"q": "要识别的文本" // 必需:要识别语言的文本
}
```
##### **响应示例**
```json
{
"message": "Success",
"code": "10000",
"data": {
"lang": "en"
}
}
```
### **3. PictureRecognizeViews (图片翻译)**
#### **端点**: `POST /api/picture-translate/`
##### **参数**
- 通过 multipart/form-data 上传文件
- 查询参数:
- `from_lang`: 源语言
- `to_lang`: 目标语言
- `picture`: 图片格式类型
##### **请求格式**
```bash
curl -X POST http://your-api.com/api/picture-translate/ \
-H "Content-Type: multipart/form-data" \
-F "file=@image.jpg" \
-G --data-urlencode "from_lang=en" \
--data-urlencode "to_lang=zh" \
--data-urlencode "picture=jpg"
```
### **4. SpeechRecognitionView (语音识别)**
#### **端点**: `POST /api/speech-recognition/`
##### **参数**
- 通过 multipart/form-data 上传语音文件
- 查询参数:
- `speech_type`: 音频格式(如 "pcm")
- `from_lang`: 源语言
- `to_lang`: 目标语言
##### **错误代码**
| 代码 | 描述 |
|------|------|
| 10000 | 成功 |
| 20001 | 不支持的语言 |
| 20002 | 无效的音频格式 |
| 20003 | 服务暂时不可用 |
### **异步实现优势**
- ✅ 非阻塞 I/O 操作
- ✅ 更好的并发处理
- ✅ 改进的响应时间
- ✅ 完整的 Daphne ASGI 兼容性
---
## 👤 用户视图
### **文件位置**
`user/views/user.py`
### **概述**
处理用户认证和邮件验证。现在完全转换为异步操作并使用标准化响应代码。
### **类详情**
```python
@permission_classes([AllowAny])
class SendUserEmailAPIView(APIView):
async def post(self, request): # 发送邮件
@permission_classes([AllowAny])
class UserLoginOrRegisterAPIView(APIView):
async def post(self, request): # 登录/注册
```
### **1. SendUserEmailAPIView**
#### **端点**: `POST /api/send-email/`
##### **参数**
```json
{
"to_email": "user@example.com" // 必需:收件人邮箱地址
}
```
##### **响应示例**
**注册邮件:**
```json
{
"message": "账号未注册,已发送注册邮件",
"code": "10001",
"data": {
"email_sent": true,
"type": "register"
}
}
```
**登录邮件:**
```json
{
"message": "邮件发送成功",
"code": "10002",
"data": {
"email_sent": true,
"type": "login"
}
}
```
### **2. UserLoginOrRegisterAPIView**
#### **端点**: `POST /api/login-register/`
##### **参数**
```json
{
"email": "user@example.com", // 必需:用户邮箱
"code": "12345678" // 必需:验证码
}
```
##### **响应示例**
**注册成功:**
```json
{
"message": "注册成功",
"code": "10003",
"data": {
"user": { /* 用户数据 */ },
"refresh": "jwt_refresh_token",
"access": "jwt_access_token",
"token_type": "bearer",
"expires_in": 604800
}
}
```
**登录成功:**
```json
{
"message": "登录成功",
"code": "10004",
"data": {
"user": { /* 用户数据 */ },
"refresh": "jwt_refresh_token",
"access": "jwt_access_token",
"token_type": "bearer",
"expires_in": 604800
}
}
```
##### **错误响应**
```json
{
"message": "邮箱地址不能为空",
"code": "20002",
"data": {}
}
```
### **标准化响应格式**
所有响应都遵循统一结构:
```json
{
"message": "可读消息",
"code": "10000", // 5位数字零填充字符串
"data": { // 可选,错误时为null
// 响应载荷
}
}
```
### **异步实现特性**
- ✅ 使用 `sync_to_async` 包装数据库操作
- ✅ 邮件发送作为异步操作
- ✅ 完整的 try-catch 块错误处理
- ✅ 代码/消息的类型安全枚举使用
---
## 📊 **统计摘要**
| 视图类 | 方法 | 异步? | 错误代码 | 状态码 |
|--------|------|-------|----------|--------|
| GetIPDataView | GET | ❌ 同步 | N/A | 200 |
| BaiduFanyiView | POST | ✅ 异步 | 多个 | 200, 400, 503 |
| RecognizeLangTypeViews | POST | ✅ 异步 | 多个 | 200, 400, 503 |
| PictureRecognizeViews | POST | ✅ 异步 | 多个 | 200, 400, 503 |
| SpeechRecognitionView | POST | ✅ 异步 | 多个 | 200, 503 |
| SendUserEmailAPIView | POST | ✅ 异步 | 3+ | 200, 201, 400, 500 |
| UserLoginOrRegisterAPIView | POST | ✅ 异步 | 6+ | 200, 400, 500 |
---
## 🚀 **快速开始指南**
### **测试端点:**
```bash
# 获取IP数据
curl -X GET http://localhost:8000/api/get-ip-data/
# 发送邮件
curl -X POST http://localhost:8000/api/send-email/ \
-H "Content-Type: application/json" \
-d '{"to_email":"test@example.com"}'
# 文本翻译
curl -X POST http://localhost:8000/api/translate/ \
-H "Content-Type: application/json" \
-d '{"q":"Hello","from_lang":"en","to_lang":"zh"}'
```
### **使用Daphne运行:**
```bash
pip install aiohttp
daphne chunyu_project.asgi:application --port 8000
```