# 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_`. - schedule_type: - `cron`: 使用 `schedule_expression` 的 crontab 表达式。 - `interval`: `schedule_expression` 为秒数。 - `daily`: `schedule_expression` 形如 `HH:MM`. - 新增/编辑/启用 会创建或替换任务;停用/删除 会移除任务。 - 默认时区为中国标准时间(Asia/Shanghai),可通过环境变量 `APP_TIMEZONE` 修改。 ## 其他 - 日志表目前只记录最终一次尝试结果,减少噪音。需要每次尝试都记录时,可在 `execute_api` 中调整。 - 响应体截断到前 2000 字符。