fix post vk

This commit is contained in:
2025-12-20 13:48:39 +03:00
parent c6aef69caf
commit 2d2b83a81b
5 changed files with 60 additions and 40 deletions
+2 -4
View File
@@ -2,7 +2,7 @@ from flask import Flask, request, jsonify, render_template
from config import Config from config import Config
from db import PostScheduler, UsersMedods, VkAPI, VkPost, db, MedodsAPI, ApiEndpoint from db import PostScheduler, UsersMedods, VkAPI, VkPost, db, MedodsAPI, ApiEndpoint
from medods_handler import updateMedodsUsers 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 from http_client import send_request
import logging import logging
import os import os
@@ -11,9 +11,8 @@ import os
app = Flask(__name__) app = Flask(__name__)
app.config.from_object(Config) app.config.from_object(Config)
flask_app = app
db.init_app(app) db.init_app(app)
init_scheduler(app)
os.makedirs("logs", exist_ok=True) os.makedirs("logs", exist_ok=True)
@@ -32,7 +31,6 @@ logger = logging.getLogger(__name__)
@app.before_request @app.before_request
def init(): def init():
db.create_all() db.create_all()
start_scheduler()
enable_publish_job() enable_publish_job()
logger.info("Приложение запущено") logger.info("Приложение запущено")
-12
View File
@@ -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
-2
View File
@@ -1,2 +0,0 @@
# extensions.py
flask_app = None
+58 -20
View File
@@ -3,28 +3,61 @@ from apscheduler.triggers.cron import CronTrigger
from db import PostScheduler from db import PostScheduler
# =========================
# Flask app (будет установлен из app.py)
# =========================
flask_app = None
# ===== Scheduler ===== # =========================
# Scheduler
# =========================
scheduler: BackgroundScheduler | None = None scheduler: BackgroundScheduler | None = None
JOB_ID = "vk_publish_job" JOB_ID = "vk_publish_job"
def start_scheduler(): def init_scheduler(app):
global scheduler """
Инициализация планировщика с Flask-приложением
Вызывать ОДИН раз при старте приложения
"""
global flask_app, scheduler
flask_app = app
if scheduler is None: if scheduler is None:
scheduler = BackgroundScheduler() scheduler = BackgroundScheduler()
scheduler.start() 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(): def enable_publish_job():
""" """
Включает выполнение handle_vk_post Включает выполнение публикации постов
""" """
from vk_handler import handle_vk_post if not scheduler:
return
scheduleData = PostScheduler.query.first() scheduleData = PostScheduler.query.first()
if not scheduleData or not scheduleData.enabled: if not scheduleData or not scheduleData.enabled:
disable_publish_job()
return return
start_hour = scheduleData.start_hour start_hour = scheduleData.start_hour
@@ -32,34 +65,39 @@ def enable_publish_job():
interval_minutes = scheduleData.interval_minutes interval_minutes = scheduleData.interval_minutes
trigger = CronTrigger( 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(): def disable_publish_job():
if scheduler and scheduler.get_job(JOB_ID): if scheduler and scheduler.get_job(JOB_ID):
scheduler.remove_job(JOB_ID) scheduler.remove_job(JOB_ID)
# =========================
# Status
# =========================
def get_scheduler_status() -> dict: def get_scheduler_status() -> dict:
scheduler_running = bool(scheduler and scheduler.running) scheduler_running = bool(scheduler and scheduler.running)
job = scheduler.get_job(JOB_ID) if scheduler_running else None job = scheduler.get_job(JOB_ID) if scheduler_running else None
status = { return {
"scheduler": scheduler_running, "scheduler": scheduler_running,
"vk_publish_job": job is not None, "vk_publish_job": job is not None,
"next_run_time": None, "next_run_time": (
}
if job:
status["next_run_time"] = (
job.next_run_time.strftime("%Y-%m-%d %H:%M:%S") 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 else None
) ),
}
return status
-2
View File
@@ -1,11 +1,9 @@
from datetime import datetime from datetime import datetime
import vk_api import vk_api
from app_context import with_app_context
from db import VkAPI, db from db import VkAPI, db
from medods_handler import setDynamicText from medods_handler import setDynamicText
@with_app_context
def handle_vk_post(): def handle_vk_post():
from app import logger from app import logger