2025-11-29 22:40:28 +08:00
2025-11-29 22:40:28 +08:00
2025-11-28 17:39:54 +08:00
2025-11-28 17:39:54 +08:00
2025-11-28 17:39:54 +08:00
2025-11-28 17:37:56 +08:00
2025-11-28 17:39:54 +08:00
2025-11-28 17:39:54 +08:00

API Scheduler Platform

Flask + MySQL 示例项目实现登录、API 配置管理、定时调用与日志查看。APScheduler 被选用作为定时调度器,因其 API 简洁、支持 cron/interval/daily 场景,并与 Flask-APScheduler 集成方便。

主要特性

  • 用户登录后才能访问Flask-Login
  • API 配置 CRUD启用/停用自动同步调度。
  • APScheduler 后台定时调用外部 API支持重试、超时。
  • 调用日志记录与过滤分页查看。
  • Jinja2 + Bootstrap 简易界面。

环境准备

  1. 安装依赖
    python -m venv venv
    source venv/bin/activate  # Windows: venv\Scripts\activate
    pip install -r requirements.txt
    
  2. 配置环境变量(示例)
    set DATABASE_URL=mysql+pymysql://user:password@localhost:3306/api_scheduler
    set SECRET_KEY=replace-me
    set FLASK_ENV=development  # 或 production
    

数据库初始化

  • 使用 Flask-Migrate
    flask db init
    flask db migrate -m "init"
    flask db upgrade
    
  • 或手动建表(简化示例):
    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 中:

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()

运行

  • 开发模式:
    flask --app run.py --debug run
    
  • 简易生产(示例):
    gunicorn "run:app" -w 4 -b 0.0.0.0:8000
    
  • 若在执行 flask db ... 迁移命令时数据库还未建表,可先禁用调度器避免表不存在报错:
    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 字符。
Description
调用api的平台
Readme 70 KiB
Languages
Python 69.9%
HTML 29.1%
Mako 1%