apiScheduler/README.md
2025-11-28 17:37:56 +08:00

122 lines
3.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# API Scheduler Platform
Flask + MySQL 示例项目实现登录、API 配置管理、定时调用与日志查看。APScheduler 被选用作为定时调度器,因其 API 简洁、支持 cron/interval/daily 场景,并与 Flask-APScheduler 集成方便。
## 主要特性
- 用户登录后才能访问Flask-Login
- API 配置 CRUD启用/停用自动同步调度。
- APScheduler 后台定时调用外部 API支持重试、超时。
- 调用日志记录与过滤分页查看。
- Jinja2 + Bootstrap 简易界面。
## 环境准备
1. 安装依赖
```bash
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt
```
2. 配置环境变量(示例)
```bash
set DATABASE_URL=mysql+pymysql://user:password@localhost:3306/api_scheduler
set SECRET_KEY=replace-me
set FLASK_ENV=development # 或 production
```
## 数据库初始化
- 使用 Flask-Migrate
```bash
flask db init
flask db migrate -m "init"
flask db upgrade
```
- 或手动建表(简化示例):
```sql
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(64) UNIQUE NOT NULL,
password_hash VARCHAR(255) NOT NULL,
email VARCHAR(128),
role VARCHAR(32),
is_active BOOLEAN DEFAULT TRUE,
created_at DATETIME,
updated_at DATETIME
);
CREATE TABLE api_configs (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(128) NOT NULL,
description TEXT,
url VARCHAR(512) NOT NULL,
http_method VARCHAR(10) NOT NULL,
headers TEXT,
query_params TEXT,
body TEXT,
enabled BOOLEAN DEFAULT TRUE,
schedule_type VARCHAR(32) NOT NULL,
schedule_expression VARCHAR(128) NOT NULL,
timeout_seconds INT,
retry_times INT,
retry_interval_seconds INT,
created_by INT,
created_at DATETIME,
updated_at DATETIME
);
CREATE TABLE api_call_logs (
id INT PRIMARY KEY AUTO_INCREMENT,
api_id INT NOT NULL,
request_time DATETIME NOT NULL,
response_time DATETIME,
success BOOLEAN,
http_status_code INT,
error_message TEXT,
response_body TEXT,
duration_ms INT,
created_at DATETIME,
updated_at DATETIME
);
```
## 创建初始管理员
在 Python shell 中:
```python
from app import create_app
from app.extensions import db
from app.models import User
app = create_app()
with app.app_context():
admin = User(username="admin", is_active=True)
admin.set_password("admin123")
db.session.add(admin)
db.session.commit()
```
## 运行
- 开发模式:
```bash
flask --app run.py --debug run
```
- 简易生产(示例):
```bash
gunicorn "run:app" -w 4 -b 0.0.0.0:8000
```
- 若在执行 `flask db ...` 迁移命令时数据库还未建表,可先禁用调度器避免表不存在报错:
```bash
set FLASK_SKIP_SCHEDULER=1
flask db upgrade
```
迁移完成后删除该变量或设为 0。
## 调度说明
- 任务 ID: `api_job_<api_id>`.
- schedule_type:
- `cron`: 使用 `schedule_expression` 的 crontab 表达式。
- `interval`: `schedule_expression` 为秒数。
- `daily`: `schedule_expression` 形如 `HH:MM`.
- 新增/编辑/启用 会创建或替换任务;停用/删除 会移除任务。
- 默认时区为中国标准时间Asia/Shanghai可通过环境变量 `APP_TIMEZONE` 修改。
## 其他
- 日志表目前只记录最终一次尝试结果,减少噪音。需要每次尝试都记录时,可在 `execute_api` 中调整。
- 响应体截断到前 2000 字符。