File size: 3,040 Bytes
91073d4 d1dc645 91073d4 d1dc645 91073d4 d1dc645 91073d4 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
import os
import logging
from datetime import datetime
from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.orm import DeclarativeBase
from werkzeug.middleware.proxy_fix import ProxyFix
from flask_login import LoginManager
from flask_wtf.csrf import CSRFProtect
# Set up logging
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)
# Define base class for SQLAlchemy models
class Base(DeclarativeBase):
pass
# Initialize extensions
db = SQLAlchemy(model_class=Base)
csrf = CSRFProtect()
login_manager = LoginManager()
# Create Flask application
app = Flask(__name__)
# Configure application
app.secret_key = os.environ.get("SESSION_SECRET", "dev-secret-key")
app.wsgi_app = ProxyFix(app.wsgi_app, x_proto=1, x_host=1)
# Configure database
app.config["SQLALCHEMY_DATABASE_URI"] = os.environ.get("DATABASE_URL", "sqlite:///forum.db")
app.config["SQLALCHEMY_ENGINE_OPTIONS"] = {
"pool_recycle": 300,
"pool_pre_ping": True,
}
# Initialize extensions with app
db.init_app(app)
csrf.init_app(app)
login_manager.init_app(app)
# Configure login manager
login_manager.login_view = "auth.login"
login_manager.login_message = "Please log in to access this page."
login_manager.login_message_category = "info"
# Import models (must be after db initialization but before create_all)
from models import User
# Register blueprints
with app.app_context():
from routes.auth import auth_bp
from routes.forum import forum_bp
from routes.user import user_bp
from routes.admin import admin_bp
from routes.cadmin import cadmin_bp
app.register_blueprint(auth_bp)
app.register_blueprint(forum_bp)
app.register_blueprint(user_bp)
app.register_blueprint(admin_bp)
app.register_blueprint(cadmin_bp)
# Create database tables
db.create_all()
# Import utility functions
from utils import format_datetime
# Add template filters
app.jinja_env.filters['format_datetime'] = format_datetime
# Context processor for template variables
@app.context_processor
def utility_processor():
return {
'now': datetime.utcnow
}
# User loader for Flask-Login
@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id))
# Error handlers
@app.errorhandler(404)
def page_not_found(e):
return render_template('errors/404.html'), 404
@app.errorhandler(403)
def forbidden(e):
return render_template('errors/403.html'), 403
@app.errorhandler(500)
def internal_server_error(e):
return render_template('errors/500.html'), 500
# Ensure required directories exist
upload_dir = os.path.join(app.static_folder, 'uploads')
avatar_dir = os.path.join(upload_dir, 'avatars')
if not os.path.exists(upload_dir):
os.makedirs(upload_dir)
if not os.path.exists(avatar_dir):
os.makedirs(avatar_dir)
logger.debug("Application initialized successfully")
|