diff --git a/app.py b/app.py index bb94fe4..4fbe215 100644 --- a/app.py +++ b/app.py @@ -2,7 +2,7 @@ from flask import Flask, request, jsonify, render_template from config import Config from db import PostScheduler, UsersMedods, VkAPI, VkPost, db, MedodsAPI, ApiEndpoint from medods_handler import updateMedodsUsers -from scheduler import enable_publish_job, get_scheduler_status, start_scheduler +from scheduler import get_scheduler_status, init_scheduler, enable_publish_job from http_client import send_request import logging import os @@ -11,9 +11,8 @@ import os app = Flask(__name__) app.config.from_object(Config) -flask_app = app - db.init_app(app) +init_scheduler(app) os.makedirs("logs", exist_ok=True) @@ -32,7 +31,6 @@ logger = logging.getLogger(__name__) @app.before_request def init(): db.create_all() - start_scheduler() enable_publish_job() logger.info("Приложение запущено") diff --git a/app_context.py b/app_context.py deleted file mode 100644 index ffe0882..0000000 --- a/app_context.py +++ /dev/null @@ -1,12 +0,0 @@ -from extensions import flask_app - - -def with_app_context(func): - def wrapper(*args, **kwargs): - if flask_app is None: - raise RuntimeError("Flask app is not initialized") - - with flask_app.app_context(): - return func(*args, **kwargs) - - return wrapper diff --git a/extensions.py b/extensions.py deleted file mode 100644 index f2d17d3..0000000 --- a/extensions.py +++ /dev/null @@ -1,2 +0,0 @@ -# extensions.py -flask_app = None diff --git a/scheduler.py b/scheduler.py index 880b634..63e8d2e 100644 --- a/scheduler.py +++ b/scheduler.py @@ -3,28 +3,61 @@ from apscheduler.triggers.cron import CronTrigger from db import PostScheduler +# ========================= +# Flask app (будет установлен из app.py) +# ========================= +flask_app = None -# ===== Scheduler ===== +# ========================= +# Scheduler +# ========================= scheduler: BackgroundScheduler | None = None JOB_ID = "vk_publish_job" -def start_scheduler(): - global scheduler +def init_scheduler(app): + """ + Инициализация планировщика с Flask-приложением + Вызывать ОДИН раз при старте приложения + """ + global flask_app, scheduler + + flask_app = app + if scheduler is None: scheduler = BackgroundScheduler() scheduler.start() -# ===== Добавление задачи ===== +# ========================= +# JOB wrapper +# ========================= +def vk_publish_job(): + """ + Обёртка для APScheduler + """ + if flask_app is None: + raise RuntimeError("Scheduler is not initialized with Flask app") + + from vk_handler import handle_vk_post + + with flask_app.app_context(): + handle_vk_post() + + +# ========================= +# Enable job +# ========================= def enable_publish_job(): """ - Включает выполнение handle_vk_post + Включает выполнение публикации постов """ - from vk_handler import handle_vk_post + if not scheduler: + return scheduleData = PostScheduler.query.first() if not scheduleData or not scheduleData.enabled: + disable_publish_job() return start_hour = scheduleData.start_hour @@ -32,34 +65,39 @@ def enable_publish_job(): interval_minutes = scheduleData.interval_minutes trigger = CronTrigger( - hour=f"{start_hour}-{end_hour - 1}", minute=f"*/{interval_minutes}" + hour=f"{start_hour}-{end_hour - 1}", + minute=f"*/{interval_minutes}", ) - scheduler.add_job(handle_vk_post, trigger=trigger, id=JOB_ID, replace_existing=True) + scheduler.add_job( + vk_publish_job, + trigger=trigger, + id=JOB_ID, + replace_existing=True, + ) -# ===== Отключение задачи ===== +# ========================= +# Disable job +# ========================= def disable_publish_job(): if scheduler and scheduler.get_job(JOB_ID): scheduler.remove_job(JOB_ID) +# ========================= +# Status +# ========================= def get_scheduler_status() -> dict: scheduler_running = bool(scheduler and scheduler.running) - job = scheduler.get_job(JOB_ID) if scheduler_running else None - status = { + return { "scheduler": scheduler_running, "vk_publish_job": job is not None, - "next_run_time": None, - } - - if job: - status["next_run_time"] = ( + "next_run_time": ( job.next_run_time.strftime("%Y-%m-%d %H:%M:%S") - if job.next_run_time + if job and job.next_run_time else None - ) - - return status + ), + } diff --git a/vk_handler.py b/vk_handler.py index 7d9f36b..17b5fb2 100644 --- a/vk_handler.py +++ b/vk_handler.py @@ -1,11 +1,9 @@ from datetime import datetime import vk_api -from app_context import with_app_context from db import VkAPI, db from medods_handler import setDynamicText -@with_app_context def handle_vk_post(): from app import logger