|
|
from flask import Flask, redirect, url_for |
|
|
from flask_sqlalchemy import SQLAlchemy |
|
|
from flask_migrate import Migrate |
|
|
from flask_login import LoginManager, current_user |
|
|
from celery import Celery |
|
|
from config import Config |
|
|
import redis |
|
|
import os |
|
|
import logging |
|
|
import sys |
|
|
from pathlib import Path |
|
|
|
|
|
|
|
|
logging.basicConfig( |
|
|
level=logging.DEBUG, |
|
|
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', |
|
|
handlers=[logging.StreamHandler(sys.stdout)] |
|
|
) |
|
|
logger = logging.getLogger(__name__) |
|
|
|
|
|
|
|
|
db = SQLAlchemy() |
|
|
migrate = Migrate() |
|
|
login = LoginManager() |
|
|
login.login_view = 'auth.login' |
|
|
celery = Celery(__name__, broker=Config.CELERY_BROKER_URL) |
|
|
cache = None |
|
|
|
|
|
|
|
|
@login.user_loader |
|
|
def load_user(user_id): |
|
|
from .models import User |
|
|
return User.query.get(int(user_id)) |
|
|
|
|
|
def create_app(config_class=Config): |
|
|
logger.info("Starting application initialization...") |
|
|
|
|
|
|
|
|
app = Flask(__name__) |
|
|
logger.info("Flask app created") |
|
|
|
|
|
|
|
|
logger.info(f"Loading configuration from {config_class}...") |
|
|
app.config.from_object(config_class) |
|
|
|
|
|
|
|
|
logger.info(f"Ensuring instance path exists: {app.config['INSTANCE_PATH']}") |
|
|
Path(app.config['INSTANCE_PATH']).mkdir(parents=True, exist_ok=True) |
|
|
app.instance_path = app.config['INSTANCE_PATH'] |
|
|
|
|
|
|
|
|
logger.info("Initializing SQLAlchemy...") |
|
|
db.init_app(app) |
|
|
migrate.init_app(app, db) |
|
|
|
|
|
logger.info("Initializing LoginManager...") |
|
|
login.init_app(app) |
|
|
|
|
|
|
|
|
logger.info("Configuring Celery...") |
|
|
celery.conf.update(app.config) |
|
|
|
|
|
|
|
|
try: |
|
|
logger.info(f"Initializing Redis cache with URL: {app.config['CELERY_BROKER_URL']}") |
|
|
global cache |
|
|
|
|
|
if app.config['CELERY_BROKER_URL'].startswith('redis://'): |
|
|
cache = redis.Redis.from_url(app.config['CELERY_BROKER_URL']) |
|
|
logger.info("Redis cache initialized successfully") |
|
|
else: |
|
|
logger.info("Not using Redis cache as broker URL is not Redis") |
|
|
cache = None |
|
|
except Exception as e: |
|
|
logger.error(f"Error initializing Redis cache: {e}") |
|
|
|
|
|
cache = None |
|
|
logger.info("Continuing without Redis cache") |
|
|
|
|
|
|
|
|
logger.info("Registering test blueprint...") |
|
|
try: |
|
|
from .routes.test import test_bp |
|
|
app.register_blueprint(test_bp) |
|
|
logger.info("Test blueprint registered successfully") |
|
|
except Exception as e: |
|
|
logger.error(f"Error registering test blueprint: {e}") |
|
|
|
|
|
|
|
|
logger.info("Registering other blueprints...") |
|
|
|
|
|
|
|
|
try: |
|
|
logger.info("Importing and registering dashboard blueprint...") |
|
|
from .routes.dashboard import dashboard_bp |
|
|
app.register_blueprint(dashboard_bp, url_prefix='/dashboard') |
|
|
logger.info("Dashboard blueprint registered successfully") |
|
|
except Exception as e: |
|
|
logger.error(f"Error registering dashboard blueprint: {e}") |
|
|
|
|
|
try: |
|
|
logger.info("Importing and registering API blueprint...") |
|
|
from .routes.api import api_bp |
|
|
app.register_blueprint(api_bp) |
|
|
logger.info("API blueprint registered successfully") |
|
|
except Exception as e: |
|
|
logger.error(f"Error registering API blueprint: {e}") |
|
|
|
|
|
try: |
|
|
logger.info("Importing and registering compliance blueprint...") |
|
|
from .routes.compliance import compliance_bp |
|
|
app.register_blueprint(compliance_bp) |
|
|
logger.info("Compliance blueprint registered successfully") |
|
|
except Exception as e: |
|
|
logger.error(f"Error registering compliance blueprint: {e}") |
|
|
|
|
|
try: |
|
|
logger.info("Importing and registering Google Ads blueprint...") |
|
|
from .routes.google_ads import google_ads_bp |
|
|
app.register_blueprint(google_ads_bp) |
|
|
logger.info("Google Ads blueprint registered successfully") |
|
|
except Exception as e: |
|
|
logger.error(f"Error registering Google Ads blueprint: {e}") |
|
|
|
|
|
try: |
|
|
logger.info("Importing and registering auth blueprint...") |
|
|
from .routes.auth import auth_bp |
|
|
app.register_blueprint(auth_bp) |
|
|
logger.info("Auth blueprint registered successfully") |
|
|
except Exception as e: |
|
|
logger.error(f"Error registering auth blueprint: {e}") |
|
|
|
|
|
try: |
|
|
logger.info("Importing and registering Facebook Ads blueprint...") |
|
|
from .routes.facebook_ads import facebook_ads_bp |
|
|
app.register_blueprint(facebook_ads_bp) |
|
|
logger.info("Facebook Ads blueprint registered successfully") |
|
|
except Exception as e: |
|
|
logger.error(f"Error registering Facebook Ads blueprint: {e}") |
|
|
|
|
|
|
|
|
@app.route('/') |
|
|
def index(): |
|
|
if current_user.is_authenticated: |
|
|
try: |
|
|
return redirect(url_for('dashboard.index')) |
|
|
except: |
|
|
|
|
|
return redirect(url_for('facebook_ads.index')) |
|
|
else: |
|
|
return redirect(url_for('auth.login')) |
|
|
|
|
|
logger.info("Application initialization complete") |
|
|
return app |