import os import logging from logging.handlers import WatchedFileHandler from flask import Flask from flask_socketio import SocketIO from app.models import db from app.utils import init_password_generator, init_serializer from app.auth import init_auth from app.seed_db import seed_courses from app.config import Config socketio = SocketIO(async_mode='eventlet', cors_allowed_origins="*", message_queue='redis://redis:6379') def create_app(config_class=Config): # 1. Setup Log Directory log_dir = os.path.join(os.getcwd(), 'logs') if not os.path.exists(log_dir): os.makedirs(log_dir) app = Flask(__name__, static_folder='static', static_url_path='/static') app.config.from_object(config_class) file_handler = WatchedFileHandler(log_dir + '/app.log', mode='a', encoding='UTF-8') file_handler.setFormatter(logging.Formatter( '%(asctime)s %(levelname)s [%(module)s:%(lineno)d]: %(message)s' )) file_handler.setLevel(logging.INFO) app.logger.addHandler(file_handler) app.logger.setLevel(logging.INFO) db.init_app(app) with app.app_context(): db.create_all() seed_courses() db.engine.dispose() init_password_generator() init_serializer(app) init_auth(app) socketio.init_app(app) from .routes import main from .blueprints.slides import slides_bp from .blueprints.admin import admin_bp app.register_blueprint(main) app.register_blueprint(slides_bp) app.register_blueprint(admin_bp) return app