This commit is contained in:
39
app.py
39
app.py
@@ -6,7 +6,7 @@ from dotenv import load_dotenv
|
||||
load_dotenv()
|
||||
|
||||
# 2. Импорт расширений из центрального файла
|
||||
from extensions import db, migrate, login_manager, babel
|
||||
from extensions import scheduler, db, migrate, login_manager, babel
|
||||
from models import init_encryption
|
||||
|
||||
# 3. Фабрика приложений
|
||||
@@ -49,16 +49,41 @@ def create_app():
|
||||
migrate.init_app(app, db)
|
||||
login_manager.init_app(app)
|
||||
babel.init_app(app, locale_selector=get_locale)
|
||||
scheduler.init_app(app)
|
||||
|
||||
init_encryption(app)
|
||||
|
||||
# --- Регистрация блюпринтов ---
|
||||
from routes import main_bp
|
||||
from routes import main_bp, execute_olap_export
|
||||
app.register_blueprint(main_bp)
|
||||
|
||||
login_manager.login_view = 'main.login'
|
||||
login_manager.login_message = "Пожалуйста, войдите, чтобы получить доступ к этой странице."
|
||||
login_manager.login_message_category = "info"
|
||||
|
||||
with app.app_context():
|
||||
from models import User, UserConfig
|
||||
all_configs = UserConfig.query.all()
|
||||
for config in all_configs:
|
||||
user_id = config.user_id
|
||||
mappings = config.mappings
|
||||
for sheer_title, params in mappings.items():
|
||||
cron_schedule = params.get('schedule_cron')
|
||||
if cron_schedule:
|
||||
job_id = f"user_{user_id}_sheet_{sheer_title}"
|
||||
try:
|
||||
scheduler.add_job(
|
||||
id=job_id,
|
||||
func=execute_olap_export,
|
||||
trigger='cron',
|
||||
args=[user_id, sheer_title],
|
||||
**_parse_cron_string(cron_schedule)
|
||||
)
|
||||
app.logger.info(f"Job {job_id} loaded on startup.")
|
||||
except Exception as e:
|
||||
app.logger.error(f"Failed to load job {job_id}: {e}")
|
||||
scheduler.start()
|
||||
|
||||
# --- Регистрация команд CLI ---
|
||||
from models import User, UserConfig
|
||||
@app.cli.command('init-db')
|
||||
@@ -73,6 +98,16 @@ def create_app():
|
||||
# --- Точка входа для запуска ---
|
||||
app = create_app()
|
||||
|
||||
# --- Вспомогательная функция для парсинга cron ---
|
||||
def _parse_cron_string(cron_str):
|
||||
"""Парсит строку cron в словарь для APScheduler."""
|
||||
parts = cron_str.split()
|
||||
if len(parts) != 5:
|
||||
raise ValueError("Invalid cron string format. Expected 5 parts.")
|
||||
|
||||
keys = ['minute', 'hour', 'day', 'month', 'day_of_week']
|
||||
return {keys[i]: part for i, part in enumerate(parts)}
|
||||
|
||||
if __name__ == '__main__':
|
||||
# Для прямого запуска через `python app.py` (удобно для отладки)
|
||||
app.run(host='0.0.0.0', port=int(os.environ.get("PORT", 5005)))
|
||||
Reference in New Issue
Block a user