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 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("Приложение запущено")
-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
# =========================
# 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
),
}
-2
View File
@@ -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