aa8af6c2e0
Flask + SQLite + Bootstrap5 暗色主题 - 仪表盘: 在线/离线统计 + 最近代理 + 操作日志 - 代理 CRUD: 增删改 + 启用/禁用 + 单/批量健康检测(SOCKS5) - 分组管理: 创建/删除/筛选 - 操作日志: 分页查询 - RESTful API + Web 界面 - 管理员登录认证 (SM_ADMIN_PASSWORD 环境变量)
59 lines
1.5 KiB
Python
59 lines
1.5 KiB
Python
import os
|
|
import logging
|
|
|
|
basedir = os.path.abspath(os.path.dirname(__file__))
|
|
|
|
|
|
class Config:
|
|
SECRET_KEY = os.environ.get("SM_SECRET_KEY", "change-me-in-production")
|
|
SQLALCHEMY_DATABASE_URI = os.environ.get(
|
|
"SM_DB_URI", f"sqlite:///{os.path.join(basedir, 'socks_manager.db')}"
|
|
)
|
|
SQLALCHEMY_TRACK_MODIFICATIONS = False
|
|
|
|
# 管理后台认证(在 create_app 时读取,确保 env var 生效)
|
|
@staticmethod
|
|
def admin_user():
|
|
return os.environ.get("SM_ADMIN_USER", "admin")
|
|
|
|
@staticmethod
|
|
def admin_password():
|
|
return os.environ.get("SM_ADMIN_PASSWORD", "")
|
|
|
|
# 健康检测
|
|
HEALTH_CHECK_TIMEOUT = int(os.environ.get("SM_HEALTH_TIMEOUT", "10"))
|
|
HEALTH_CHECK_INTERVAL = int(os.environ.get("SM_HEALTH_INTERVAL", "300")) # 秒
|
|
|
|
LOG_LEVEL = os.environ.get("SM_LOG_LEVEL", "INFO")
|
|
|
|
|
|
def create_app(config_class=Config):
|
|
from flask import Flask
|
|
|
|
app = Flask(__name__)
|
|
app.config.from_object(config_class)
|
|
|
|
# 日志
|
|
logging.basicConfig(
|
|
level=getattr(logging, app.config["LOG_LEVEL"]),
|
|
format="%(asctime)s [%(levelname)s] %(message)s",
|
|
)
|
|
|
|
from extensions import db
|
|
db.init_app(app)
|
|
|
|
from models import db as _db
|
|
with app.app_context():
|
|
_db.create_all()
|
|
|
|
# Blueprint 注册
|
|
from routes import main
|
|
from routes import api
|
|
from auth import bp as auth_bp
|
|
|
|
app.register_blueprint(auth_bp)
|
|
app.register_blueprint(main.bp)
|
|
app.register_blueprint(api.bp, url_prefix="/api")
|
|
|
|
return app
|