f103148ebf
基于 Flask + MySQL + Bootstrap 5 的全栈个人资料库管理系统。 主要功能: - 管理员/普通用户双角色权限体系,全站登录保护 - 资源管理:文本、图片、音频、视频四类资源 - 三种添加方式:本地上传(拖拽)、URL 后台下载、磁力下载(aria2c) - 在线预览:文本、图片、HTML5 音视频播放器 - 安全:bcrypt 加盐密码哈希、CSRF 防护、SQLAlchemy ORM 防注入 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
61 lines
1.8 KiB
Python
61 lines
1.8 KiB
Python
import os
|
|
from flask import Flask
|
|
from config import config
|
|
from app.extensions import db, login_manager, bcrypt, csrf, migrate
|
|
|
|
|
|
def create_app(config_name=None):
|
|
if config_name is None:
|
|
config_name = os.environ.get('FLASK_ENV', 'default')
|
|
|
|
app = Flask(__name__)
|
|
app.config.from_object(config[config_name])
|
|
|
|
# 确保上传目录存在
|
|
os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True)
|
|
for sub in ['text', 'image', 'audio', 'video', 'temp']:
|
|
os.makedirs(os.path.join(app.config['UPLOAD_FOLDER'], sub), exist_ok=True)
|
|
|
|
# 初始化扩展
|
|
db.init_app(app)
|
|
login_manager.init_app(app)
|
|
bcrypt.init_app(app)
|
|
csrf.init_app(app)
|
|
migrate.init_app(app, db)
|
|
|
|
# 注册蓝图
|
|
from app.routes.auth import auth_bp
|
|
from app.routes.admin import admin_bp
|
|
from app.routes.resources import resources_bp
|
|
from app.routes.main import main_bp
|
|
|
|
app.register_blueprint(auth_bp, url_prefix='/auth')
|
|
app.register_blueprint(admin_bp, url_prefix='/admin')
|
|
app.register_blueprint(resources_bp, url_prefix='/resources')
|
|
app.register_blueprint(main_bp)
|
|
|
|
# 注册错误处理
|
|
from app.routes.errors import register_error_handlers
|
|
register_error_handlers(app)
|
|
|
|
# 注册模板过滤器
|
|
from app.utils.filters import register_filters
|
|
register_filters(app)
|
|
|
|
# 注册全局模板函数
|
|
from flask_wtf.csrf import generate_csrf
|
|
from markupsafe import Markup
|
|
|
|
@app.context_processor
|
|
def inject_globals():
|
|
from app.models.setting import SystemSetting
|
|
site_name = SystemSetting.get('site_name', '个人资料库')
|
|
return dict(site_name=site_name)
|
|
|
|
@app.template_global()
|
|
def csrf_token_input():
|
|
token = generate_csrf()
|
|
return Markup(f'<input type="hidden" name="csrf_token" value="{token}">')
|
|
|
|
return app
|