Files
pit-router/app/__init__.py

137 lines
3.8 KiB
Python

"""
PIT Router Flask 应用工厂
"""
from flask import Flask
from flask_socketio import SocketIO
import logging
from app.config import config
from app.extensions import (
db, migrate, jwt, login_manager, cors, limiter, init_redis
)
# Socket.IO 实例 - 避免与 app/socketio 目录冲突
socketio_app = SocketIO(cors_allowed_origins="*", async_mode='threading')
def create_app(config_name='default'):
"""创建 Flask 应用实例"""
app = Flask(__name__)
app.config.from_object(config[config_name])
# 初始化扩展
_init_extensions(app)
# 注册蓝图
_register_blueprints(app)
# 注册 Socket.IO 事件
_register_socketio_events()
# 配置日志
_configure_logging(app)
# 注册错误处理
_register_error_handlers(app)
# 根路由
@app.route('/')
def index():
return {
'service': 'PIT Router',
'version': '0.6.0',
'status': 'running',
'endpoints': {
'health': '/health',
'auth': '/api/auth',
'sessions': '/api/sessions',
'agents': '/api/agents',
'gateways': '/api/gateways',
'messages': '/api/messages',
'stats': '/api/stats',
'websocket': 'ws://host:9000'
}
}
# 健康检查端点
@app.route('/health')
def health_check():
return {'status': 'ok', 'service': 'pit-router'}
return app
def _init_extensions(app):
"""初始化 Flask 扩展"""
db.init_app(app)
migrate.init_app(app, db)
jwt.init_app(app)
login_manager.init_app(app)
cors.init_app(app)
limiter.init_app(app)
socketio_app.init_app(app)
# 初始化 Redis
init_redis(app)
# 创建数据库表
with app.app_context():
db.create_all()
def _register_blueprints(app):
"""注册蓝图"""
from app.routes.auth import auth_bp
from app.routes.sessions import sessions_bp
from app.routes.agents import agents_bp
from app.routes.gateways import gateways_bp
from app.routes.messages import messages_bp
from app.routes.stats import stats_bp
app.register_blueprint(auth_bp, url_prefix='/api/auth')
app.register_blueprint(sessions_bp, url_prefix='/api/sessions')
app.register_blueprint(agents_bp, url_prefix='/api/agents')
app.register_blueprint(gateways_bp, url_prefix='/api/gateways')
app.register_blueprint(messages_bp, url_prefix='/api/messages')
app.register_blueprint(stats_bp, url_prefix='/api/stats')
def _register_socketio_events():
"""注册 Socket.IO 事件处理器"""
from app.socketio import handlers as socketio_handlers
socketio_handlers.register_handlers(socketio_app)
def _configure_logging(app):
"""配置日志"""
log_level = app.config.get('LOG_LEVEL', 'INFO')
logging.basicConfig(
level=getattr(logging, log_level),
format='%(asctime)s [%(levelname)s] %(name)s: %(message)s'
)
def _register_error_handlers(app):
"""注册错误处理器"""
from flask import jsonify
@app.errorhandler(400)
def bad_request(error):
return jsonify({'error': 'Bad Request', 'message': str(error)}), 400
@app.errorhandler(401)
def unauthorized(error):
return jsonify({'error': 'Unauthorized', 'message': str(error)}), 401
@app.errorhandler(403)
def forbidden(error):
return jsonify({'error': 'Forbidden', 'message': str(error)}), 403
@app.errorhandler(404)
def not_found(error):
return jsonify({'error': 'Not Found', 'message': str(error)}), 404
@app.errorhandler(500)
def internal_error(error):
return jsonify({'error': 'Internal Server Error', 'message': str(error)}), 500