|
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 |
|
|
|
|
|
logging.basicConfig(level=logging.DEBUG) |
|
logger = logging.getLogger(__name__) |
|
|
|
|
|
class Base(DeclarativeBase): |
|
pass |
|
|
|
|
|
db = SQLAlchemy(model_class=Base) |
|
csrf = CSRFProtect() |
|
login_manager = LoginManager() |
|
|
|
|
|
app = Flask(__name__) |
|
|
|
|
|
app.secret_key = os.environ.get("SESSION_SECRET", "dev-secret-key") |
|
app.wsgi_app = ProxyFix(app.wsgi_app, x_proto=1, x_host=1) |
|
|
|
|
|
app.config["SQLALCHEMY_DATABASE_URI"] = os.environ.get("DATABASE_URL", "sqlite:///forrum.db") |
|
app.config["SQLALCHEMY_ENGINE_OPTIONS"] = { |
|
"pool_recycle": 300, |
|
"pool_pre_ping": True, |
|
} |
|
|
|
|
|
db.init_app(app) |
|
csrf.init_app(app) |
|
login_manager.init_app(app) |
|
|
|
|
|
login_manager.login_view = "auth.login" |
|
login_manager.login_message = "Please log in to access this page." |
|
login_manager.login_message_category = "info" |
|
|
|
|
|
from models import User |
|
|
|
|
|
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) |
|
|
|
|
|
db.create_all() |
|
|
|
|
|
from utils import format_datetime |
|
|
|
|
|
app.jinja_env.filters['format_datetime'] = format_datetime |
|
|
|
|
|
@app.context_processor |
|
def utility_processor(): |
|
return { |
|
'now': datetime.utcnow |
|
} |
|
|
|
|
|
@login_manager.user_loader |
|
def load_user(user_id): |
|
return User.query.get(int(user_id)) |
|
|
|
|
|
@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 |
|
|
|
|
|
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") |
|
|