This commit is contained in:
62
app.py
62
app.py
@@ -17,6 +17,34 @@ def create_app():
|
||||
"""
|
||||
app = Flask(__name__)
|
||||
|
||||
if not app.debug:
|
||||
import logging
|
||||
from logging.handlers import RotatingFileHandler
|
||||
|
||||
# Создаем папку для логов, если ее нет
|
||||
log_dir = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'data')
|
||||
os.makedirs(log_dir, exist_ok=True)
|
||||
|
||||
log_file = os.path.join(log_dir, 'olaper.log')
|
||||
|
||||
# Создаем обработчик, который пишет логи в файл с ротацией
|
||||
# 10 МБ на файл, храним 5 старых файлов
|
||||
file_handler = RotatingFileHandler(log_file, maxBytes=1024*1024*10, backupCount=5, encoding='utf-8')
|
||||
|
||||
# Устанавливаем формат сообщений
|
||||
file_handler.setFormatter(logging.Formatter(
|
||||
'%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d]'
|
||||
))
|
||||
|
||||
# Устанавливаем уровень логирования
|
||||
file_handler.setLevel(logging.INFO)
|
||||
|
||||
# Добавляем обработчик к логгеру приложения
|
||||
app.logger.addHandler(file_handler)
|
||||
|
||||
app.logger.setLevel(logging.INFO)
|
||||
app.logger.info('Application startup')
|
||||
|
||||
# --- Конфигурация приложения ---
|
||||
app.config['SECRET_KEY'] = os.environ.get('SECRET_KEY', 'default-super-secret-key-for-dev')
|
||||
|
||||
@@ -65,26 +93,28 @@ def create_app():
|
||||
with app.app_context():
|
||||
if inspect(db.engine).has_table('user_config'):
|
||||
from models import User, UserConfig
|
||||
from utils import _parse_cron_string
|
||||
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():
|
||||
for sheet_title, params in mappings.items():
|
||||
if isinstance(params, dict):
|
||||
cron_schedule = params.get('schedule_cron')
|
||||
if cron_schedule:
|
||||
job_id = f"user_{user_id}_sheet_{sheer_title}"
|
||||
job_id = f"user_{user_id}_sheet_{sheet_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.")
|
||||
if not scheduler.get_job(job_id):
|
||||
scheduler.add_job(
|
||||
id=job_id,
|
||||
func=execute_olap_export,
|
||||
trigger='cron',
|
||||
args=[app, user_id, sheet_title],
|
||||
**_parse_cron_string(cron_schedule)
|
||||
)
|
||||
app.logger.info(f"Scheduled job loaded on startup: {job_id} with schedule '{cron_schedule}'")
|
||||
except Exception as e:
|
||||
app.logger.error(f"Failed to load job {job_id}: {e}")
|
||||
app.logger.error(f"Failed to load job {job_id} with schedule '{cron_schedule}': {e}")
|
||||
else:
|
||||
app.logger.warning("Database tables not found. Skipping job loading on startup. Run 'flask init-db' to create the tables.")
|
||||
scheduler.start()
|
||||
@@ -103,16 +133,6 @@ 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