docs: 更新API文档,添加临时文件上传API和临时发言说明
This commit is contained in:
164
README.md
164
README.md
@@ -1588,9 +1588,11 @@ sudo systemctl restart gunicorn
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## API接口文档
|
## API接口文档
|
||||||
|
|
||||||
系统提供RESTful API接口,用于外部客户端提交汇总记录。
|
系统提供RESTful API接口,支持外部客户端提交汇总记录和临时文件。
|
||||||
|
|
||||||
### 1. 汇总记录提交API
|
### 1. 汇总记录提交API
|
||||||
|
|
||||||
@@ -1607,6 +1609,7 @@ sudo systemctl restart gunicorn
|
|||||||
| 参数名 | 类型 | 必填 | 说明 |
|
| 参数名 | 类型 | 必填 | 说明 |
|
||||||
|-------|------|------|------|
|
|-------|------|------|------|
|
||||||
| content | string | 是 | 汇总记录内容,最大长度不限 |
|
| content | string | 是 | 汇总记录内容,最大长度不限 |
|
||||||
|
| source | string | 否 | 来源,自动获取客户端主机名和IP |
|
||||||
|
|
||||||
#### 响应格式
|
#### 响应格式
|
||||||
|
|
||||||
@@ -1639,7 +1642,7 @@ import requests
|
|||||||
|
|
||||||
url = "http://your-server/api/v1/summary/submit/"
|
url = "http://your-server/api/v1/summary/submit/"
|
||||||
data = {
|
data = {
|
||||||
"content": "监控报告:系统运行正常,CPU使用率15%,内存使用率42%"
|
"content": "监控报告:系统运行正常"
|
||||||
}
|
}
|
||||||
|
|
||||||
response = requests.post(url, data=data)
|
response = requests.post(url, data=data)
|
||||||
@@ -1647,50 +1650,6 @@ result = response.json()
|
|||||||
print(result)
|
print(result)
|
||||||
```
|
```
|
||||||
|
|
||||||
#### 客户端自动提交示例
|
|
||||||
|
|
||||||
创建一个Python脚本用于自动提交系统监控数据:
|
|
||||||
|
|
||||||
```python
|
|
||||||
#!/usr/bin/env python3
|
|
||||||
# submit_summary.py
|
|
||||||
|
|
||||||
import socket
|
|
||||||
import psutil
|
|
||||||
import requests
|
|
||||||
from datetime import datetime
|
|
||||||
|
|
||||||
def get_system_info():
|
|
||||||
"""获取系统基本信息"""
|
|
||||||
cpu_percent = psutil.cpu_percent(interval=1)
|
|
||||||
memory = psutil.virtual_memory()
|
|
||||||
disk = psutil.disk_usage('/')
|
|
||||||
return {
|
|
||||||
'cpu': cpu_percent,
|
|
||||||
'memory': memory.percent,
|
|
||||||
'disk': disk.percent
|
|
||||||
}
|
|
||||||
|
|
||||||
def submit_summary(content):
|
|
||||||
"""提交汇总记录到家庭日报系统"""
|
|
||||||
url = "http://your-server/api/v1/summary/submit/"
|
|
||||||
try:
|
|
||||||
response = requests.post(url, data={'content': content}, timeout=10)
|
|
||||||
result = response.json()
|
|
||||||
if result['success']:
|
|
||||||
print(f"提交成功,记录ID: {result['id']}")
|
|
||||||
else:
|
|
||||||
print(f"提交失败: {result['message']}")
|
|
||||||
except Exception as e:
|
|
||||||
print(f"请求异常: {str(e)}")
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
info = get_system_info()
|
|
||||||
timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
|
|
||||||
content = f"[系统监控 {timestamp}] CPU使用率: {info['cpu']}%, 内存使用率: {info['memory']}%, 磁盘使用率: {info['disk']}%"
|
|
||||||
submit_summary(content)
|
|
||||||
```
|
|
||||||
|
|
||||||
#### 注意事项
|
#### 注意事项
|
||||||
|
|
||||||
1. **数据验证**:API仅接受以下条件的记录:
|
1. **数据验证**:API仅接受以下条件的记录:
|
||||||
@@ -1702,11 +1661,103 @@ if __name__ == "__main__":
|
|||||||
|
|
||||||
3. **日期自动设置**:记录日期自动设置为提交时的日期。
|
3. **日期自动设置**:记录日期自动设置为提交时的日期。
|
||||||
|
|
||||||
4. **错误处理**:如果分类或发言人不存在,API会返回错误信息。
|
---
|
||||||
|
|
||||||
### 2. 初始化必需数据
|
### 2. 临时文件上传API
|
||||||
|
|
||||||
在使用API提交功能前,需要确保数据库中存在以下数据:
|
用于上传临时文件到公开内容,支持1小时/1天/7天过期自动删除。
|
||||||
|
|
||||||
|
#### 请求信息
|
||||||
|
|
||||||
|
- **URL**: `/api/v1/temp-upload/`
|
||||||
|
- **方法**: `POST`
|
||||||
|
- **Content-Type**: `multipart/form-data`
|
||||||
|
- **文件大小限制**: 500MB
|
||||||
|
|
||||||
|
#### 请求参数
|
||||||
|
|
||||||
|
| 参数名 | 类型 | 必填 | 说明 |
|
||||||
|
|-------|------|------|------|
|
||||||
|
| title | string | 是 | 文件标题 |
|
||||||
|
| file | file | 是 | 上传的文件,最大500MB |
|
||||||
|
| expire_type | string | 是 | 过期时间:`expire_1h`(1小时) / `expire_1d`(1天) / `expire_7d`(7天) |
|
||||||
|
|
||||||
|
#### 响应格式
|
||||||
|
|
||||||
|
**成功响应** (HTTP 200):
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"success": true,
|
||||||
|
"message": "上传成功",
|
||||||
|
"id": 1,
|
||||||
|
"file_url": "http://your-server/media/public_files/xxx.pdf",
|
||||||
|
"file_name": "document.pdf",
|
||||||
|
"file_size": 1048576,
|
||||||
|
"expire_at": "2026-05-25T18:30:00Z",
|
||||||
|
"expire_type": "expire_1d"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**失败响应** (HTTP 400/500):
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"success": false,
|
||||||
|
"message": "错误信息描述"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 调用示例
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 使用 curl 上传文件
|
||||||
|
curl -X POST http://your-server/api/v1/temp-upload/ \
|
||||||
|
-F "file=@document.pdf" \
|
||||||
|
-F "title=测试文件" \
|
||||||
|
-F "expire_type=expire_1d"
|
||||||
|
|
||||||
|
# Python requests 调用示例
|
||||||
|
import requests
|
||||||
|
|
||||||
|
url = "http://your-server/api/v1/temp-upload/"
|
||||||
|
files = {'file': open('document.pdf', 'rb')}
|
||||||
|
data = {
|
||||||
|
'title': '测试文件',
|
||||||
|
'expire_type': 'expire_1d'
|
||||||
|
}
|
||||||
|
|
||||||
|
response = requests.post(url, files=files, data=data)
|
||||||
|
result = response.json()
|
||||||
|
print(result)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3. 临时发言(页面表单)
|
||||||
|
|
||||||
|
在公开内容页面 `/public/` 提供临时留言功能。
|
||||||
|
|
||||||
|
#### 功能说明
|
||||||
|
|
||||||
|
- 用户名:可选,最大20字节
|
||||||
|
- 内容:必填,最大1000字节
|
||||||
|
- 留言保留时间:10分钟
|
||||||
|
- 显示:用户名(可选)、内容、时间、来源IP
|
||||||
|
|
||||||
|
#### 提交方式
|
||||||
|
|
||||||
|
在 `/public/` 页面直接填写表单提交,无需API调用。
|
||||||
|
|
||||||
|
#### 显示规则
|
||||||
|
|
||||||
|
- 只显示10分钟内的留言
|
||||||
|
- 过期后自动从页面移除
|
||||||
|
- 后台定时任务定期清理过期数据
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 4. 初始化必需数据
|
||||||
|
|
||||||
|
在使用API提交汇总记录前,需要确保数据库中存在以下数据:
|
||||||
|
|
||||||
#### 方法一:Django Shell初始化
|
#### 方法一:Django Shell初始化
|
||||||
|
|
||||||
@@ -1738,7 +1789,9 @@ print('初始化完成')
|
|||||||
2. 在 **汇总分类** 中添加名为"定期"的分类
|
2. 在 **汇总分类** 中添加名为"定期"的分类
|
||||||
3. 在 **家庭成员** 中添加名为"机器人"的成员
|
3. 在 **家庭成员** 中添加名为"机器人"的成员
|
||||||
|
|
||||||
### 3. 常见问题排查
|
---
|
||||||
|
|
||||||
|
### 5. 常见问题排查
|
||||||
|
|
||||||
#### 问题1:提交返回"分类 '定期' 不存在"
|
#### 问题1:提交返回"分类 '定期' 不存在"
|
||||||
|
|
||||||
@@ -1748,7 +1801,7 @@ print('初始化完成')
|
|||||||
|
|
||||||
**解决方法**:在数据库中创建该发言人(见上方初始化方法)
|
**解决方法**:在数据库中创建该发言人(见上方初始化方法)
|
||||||
|
|
||||||
#### 问题3:提交返回"内容不能为空"
|
#### 问题3:上传返回"内容不能为空"
|
||||||
|
|
||||||
**解决方法**:确保请求中包含 `content` 参数且不为空
|
**解决方法**:确保请求中包含 `content` 参数且不为空
|
||||||
|
|
||||||
@@ -1756,6 +1809,15 @@ print('初始化完成')
|
|||||||
|
|
||||||
**解决方法**:确认使用的是POST方法,不是GET方法
|
**解决方法**:确认使用的是POST方法,不是GET方法
|
||||||
|
|
||||||
|
#### 问题5:文件上传失败(413 Request Entity Too Large)
|
||||||
|
|
||||||
|
**解决方法**:检查nginx配置中的 `client_max_body_size` 是否大于500m
|
||||||
|
|
||||||
|
```nginx
|
||||||
|
# 在 /etc/nginx/sites-enabled/diary_family 中添加
|
||||||
|
client_max_body_size 500m;
|
||||||
|
```
|
||||||
|
|
||||||
## Fail2ban 登录保护配置
|
## Fail2ban 登录保护配置
|
||||||
|
|
||||||
为了防止暴力破解登录密码,系统集成了 Fail2ban 自动封禁功能。当用户在短时间内多次登录失败时,其 IP 地址将被自动封禁。
|
为了防止暴力破解登录密码,系统集成了 Fail2ban 自动封禁功能。当用户在短时间内多次登录失败时,其 IP 地址将被自动封禁。
|
||||||
|
|||||||
Reference in New Issue
Block a user