1
1
import logging
2
2
import os
3
- from datetime import datetime , timedelta
4
- from typing import Dict , Optional , Tuple , Any , Union
3
+ from datetime import datetime
4
+ from pathlib import Path
5
+ from typing import Dict , Tuple , Union
5
6
6
- # 添加 monkey patch 修复 Flask-Session 与 Werkzeug 的兼容性问题
7
- import flask_session .sessions
8
7
from flask import Flask , redirect , url_for
9
8
from flask_login import LoginManager
10
9
from flask_session import Session
11
10
from flask_socketio import SocketIO
12
11
from loguru import logger
13
12
14
- # 保存原始的 save_session 方法
15
- original_save_session = flask_session .sessions .FileSystemSessionInterface .save_session
16
-
17
- # 创建修复的 save_session 方法
18
- def patched_save_session (self , app , session , response ):
19
- # 如果会话 ID 是字节类型,转换为字符串
20
- if hasattr (self , 'get_session_id' ) and callable (self .get_session_id ):
21
- original_get_session_id = self .get_session_id
22
-
23
- def wrapped_get_session_id (session ):
24
- session_id = original_get_session_id (session )
25
- if isinstance (session_id , bytes ):
26
- return session_id .decode ('utf-8' )
27
- return session_id
28
-
29
- self .get_session_id = wrapped_get_session_id
30
-
31
- # 调用原始方法
32
- return original_save_session (self , app , session , response )
33
-
34
- # 应用 monkey patch
35
- flask_session .sessions .FileSystemSessionInterface .save_session = patched_save_session
36
-
37
13
38
14
class InterceptHandler (logging .Handler ):
39
- """将标准日志重定向到loguru的处理器
40
-
41
- 此类拦截标准logging模块的日志记录,并将其重定向到loguru,
42
- 确保所有日志使用统一的格式和处理方式。
43
- """
44
-
45
15
def emit (self , record : logging .LogRecord ) -> None :
46
- """处理日志记录并转发到loguru
47
-
48
- Args:
49
- record: 标准日志模块的日志记录对象
50
- """
51
16
logger_opt = logger .opt (depth = 6 , exception = record .exc_info )
52
17
logger_opt .log ('WEBUI' , record .getMessage ())
53
18
54
19
55
20
def _configure_logging (app : Flask ) -> None :
56
- """配置应用日志系统,使用loguru处理所有日志
57
-
58
- Args:
59
- app: Flask应用实例
60
- """
61
21
# 清除Flask默认日志处理器并配置使用loguru
62
22
app .logger .handlers = []
63
23
app .logger .propagate = False
@@ -69,15 +29,7 @@ def _configure_logging(app: Flask) -> None:
69
29
werkzeug_logger .propagate = False
70
30
werkzeug_logger .addHandler (InterceptHandler ())
71
31
72
- logger .log ('WEBUI' , "日志系统已配置为使用loguru" )
73
-
74
-
75
32
def _setup_instance_directories (app : Flask ) -> None :
76
- """确保应用所需的实例目录存在
77
-
78
- Args:
79
- app: Flask应用实例
80
- """
81
33
try :
82
34
os .makedirs (app .instance_path , exist_ok = True )
83
35
os .makedirs (app .config ['SESSION_FILE_DIR' ], exist_ok = True )
@@ -86,11 +38,8 @@ def _setup_instance_directories(app: Flask) -> None:
86
38
logger .log ('WEBUI' , f"创建实例目录失败: { e } " )
87
39
88
40
89
- def create_app (test_config : Optional [ Dict [ str , Any ]] = None ) -> Tuple [Flask , SocketIO ]:
41
+ def create_app () -> Tuple [Flask , SocketIO ]:
90
42
"""创建并配置Flask应用实例及SocketIO实例
91
-
92
- Args:
93
- test_config: 可选的测试配置字典,用于测试环境
94
43
95
44
Returns:
96
45
tuple: 包含配置好的Flask应用实例和SocketIO实例
@@ -100,54 +49,35 @@ def create_app(test_config: Optional[Dict[str, Any]] = None) -> Tuple[Flask, Soc
100
49
instance_relative_config = True ,
101
50
static_folder = 'static' ,
102
51
template_folder = 'templates' )
52
+ # 配置日志系统
53
+ _configure_logging (app )
103
54
104
55
logger .log ('WEBUI' , "正在初始化XYBotV2 WebUI应用..." )
105
56
106
- # 加载默认配置
107
- app .config .from_mapping (
108
- SECRET_KEY = os .environ .get ('SECRET_KEY' , 'dev_key_please_change_in_production' ),
109
- SESSION_TYPE = 'filesystem' ,
110
- SESSION_FILE_DIR = os .path .join (app .instance_path , 'flask_session' ),
111
- SESSION_PERMANENT = True ,
112
- PERMANENT_SESSION_LIFETIME = timedelta (minutes = 30 ),
113
- SESSION_USE_SIGNER = True ,
114
- )
115
-
116
- # 加载实例配置(如果存在)
117
- if test_config is None :
118
- # 非测试模式下,从配置文件加载
119
- app .config .from_pyfile ('config.py' , silent = True )
120
- logger .log ('WEBUI' , "已从config.py加载配置" )
121
- else :
122
- # 测试模式下,使用传入的配置
123
- app .config .from_mapping (test_config )
124
- logger .log ('WEBUI' , "已加载测试配置" )
57
+ # 加载配置
58
+ app .config .from_pyfile (Path (__file__ ).resolve ().parent / 'config.py' )
59
+ logger .log ('WEBUI' , "已加载WEBUI配置" )
125
60
126
61
# 确保实例文件夹存在
127
62
_setup_instance_directories (app )
128
63
129
- # 配置日志系统
130
- _configure_logging (app )
131
64
132
65
# 初始化Flask-Session
133
66
Session (app )
134
- logger .log ('WEBUI' , "已初始化会话管理" )
135
67
136
68
# 初始化Flask-Login
137
69
login_manager = LoginManager ()
138
70
login_manager .init_app (app )
139
71
login_manager .login_view = 'auth.login'
140
- logger .log ('WEBUI' , "已初始化用户认证系统" )
141
72
142
73
# 注册模板过滤器
143
74
from .utils .template_filters import register_template_filters
144
75
register_template_filters (app )
145
- logger .log ('WEBUI' , "已注册模板过滤器" )
146
76
147
77
# 注册蓝图
148
78
from .routes import register_blueprints
149
79
register_blueprints (app )
150
- logger .log ('WEBUI' , "已注册路由蓝图" )
80
+ logger .log ('WEBUI' , "已注册路由蓝图,模板过滤器 " )
151
81
152
82
# 初始化WebSocket服务
153
83
from .services .websocket_service import socketio , init_websocket
@@ -162,7 +92,7 @@ def create_app(test_config: Optional[Dict[str, Any]] = None) -> Tuple[Flask, Soc
162
92
163
93
# 初始化socketio
164
94
socketio .init_app (app , ** socketio_config )
165
- logger .log ('WEBUI' , "已初始化SocketIO服务 " )
95
+ logger .log ('WEBUI' , "已初始化会话管理,用户认证系统,SocketIO服务 " )
166
96
167
97
# 启动WebSocket服务
168
98
init_websocket ()
@@ -184,17 +114,8 @@ def inject_global_vars() -> Dict[str, Union[str, datetime]]:
184
114
185
115
# 定义用户加载函数
186
116
@login_manager .user_loader
187
- def load_user (user_id : str ) -> Any :
188
- """根据用户ID加载用户对象
189
-
190
- Args:
191
- user_id: 用户的唯一标识符
192
-
193
- Returns:
194
- 用户对象或None(如果用户不存在)
195
- """
196
- from .models import User
197
- return User .get (user_id )
117
+ def load_user (user_id ):
118
+ pass
198
119
199
120
# 简单的首页路由(重定向到概览页)
200
121
@app .route ('/' )
0 commit comments