fix post vk
This commit is contained in:
@@ -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("Приложение запущено")
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
# extensions.py
|
|
||||||
flask_app = None
|
|
||||||
+58
-20
@@ -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
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user