12
12
parser .add_argument ('--port' , type = int , default = 28883 , help = '应用的运行端口,默认28883' )
13
13
parser .add_argument ('--auth' , type = str , default = '' , help = '用于验证Header.Authentication字段,建议纯ASCII字符' )
14
14
parser .add_argument ("--debug" , action = "store_true" , help = "Enable debug mode" )
15
+ parser .add_argument ('--ip' , type = str , default = '*' , help = '服务器监听IP,默认*' )
16
+ parser .add_argument ('--token' , type = str , default = '' , help = '用于翻译歌词的API Token' )
15
17
kw_args , unknown_args = parser .parse_known_args ()
16
18
arg_auths : dict = {kw_args .auth : "rwd" } if kw_args .auth else None
17
19
@@ -70,6 +72,7 @@ def __init__(self):
70
72
self .auth = os .environ .get ('API_AUTH' , None )
71
73
self .port = os .environ .get ('API_PORT' , None )
72
74
self .auths = None
75
+ self .token = os .environ .get ('API_TOKEN' , None )
73
76
if self .auth :
74
77
self .auths : dict = {
75
78
self .auth : "all"
@@ -120,48 +123,31 @@ class Args():
120
123
def __init__ (self , data = None , default = None ):
121
124
self .__data : dict = data
122
125
self .__default : dict = default or {}
126
+ self .version = "1.5.7"
127
+ self .debug = kw_args .debug
123
128
124
129
def __invert__ (self ):
125
- return self .__data
126
-
127
- def __get (self , key : str ) -> 'Args' :
128
- # 如果不是字典,则返回Args包装的None
129
- if not isinstance (self .__data , dict ):
130
- return Args ()
131
- else :
132
- # 如果key不存在,则返回Args包装的None
133
- if key not in self .__data .keys ():
134
- return Args ()
135
- # 如果key对应的值是字典,则返回Args包装的字典,默认值从__default中获取
136
- if isinstance (self .__data [key ], dict ):
137
- return Args (data = self .__data [key ], default = self .__default .get (key , {}))
138
- # 如果key对应的值不是字典,则返回Args包装的值
139
- return Args (data = self .__data [key ])
140
-
141
- def __set_default (self , default_data : dict ):
142
- self .__default = default_data
143
-
144
- def __call__ (self ):
145
130
"""
146
131
JSON: config/config.json
147
132
YAML: config/config.yaml
148
133
149
134
default: YAML
150
135
"""
136
+ # 1. 首先用默认值初始化
137
+ self .__data = self .__default .copy ()
138
+
139
+ # 2. 加载配置文件,使用update而不是直接赋值
151
140
for loader in (self .__load_json , self .__load_yaml ):
152
141
data = loader ()
153
142
if isinstance (data , dict ):
154
- self .__data = data
155
- return
156
- # 如果没有读取到有效数据,则使用默认数据
157
- self .__data = self .__default
158
- # 写入默认数据
159
- directory = os .path .join (os .getcwd (), "config" )
160
- if not os .path .exists (directory ):
161
- os .makedirs (directory )
162
- file_path = os .path .join (directory , "config.yaml" )
163
- with open (file_path , "w+" ) as yaml_file :
164
- yaml .dump (DEFAULT_DATA , yaml_file )
143
+ self .__data .update (data )
144
+ break
145
+
146
+ # 3. 加载环境变量
147
+ self .__load_env ()
148
+
149
+ # 4. 最后加载命令行参数(最高优先级)
150
+ self .__load_arg ()
165
151
166
152
@staticmethod
167
153
def __load_json () -> dict | None :
@@ -181,17 +167,55 @@ def __load_yaml() -> dict|None:
181
167
return yaml .safe_load (yaml_file )
182
168
except (yaml .YAMLError , FileNotFoundError ):
183
169
return None
184
-
185
- def __getattribute__ (self , item ):
186
- if item .startswith ('_' ):
187
- return super ().__getattribute__ (item )
188
- return self .__get (item )
189
-
190
- def __str__ (self ):
191
- return str ({
192
- "data" : self .__data ,
193
- "default" : self .__default
194
- })
170
+
171
+ def __load_env (self ):
172
+ auth = os .environ .get ('API_AUTH' , None )
173
+ port = os .environ .get ('API_PORT' , None )
174
+ token = os .environ .get ('API_TOKEN' , None )
175
+ if auth :
176
+ self .__data ["auth" ] = {auth : "all" }
177
+ if port :
178
+ # 确保 server 是一个字典
179
+ if not isinstance (self .__data .get ("server" ), dict ):
180
+ self .__data ["server" ] = {"ip" : "*" }
181
+ self .__data ["server" ]["port" ] = port
182
+ if token :
183
+ self .__data ["token" ] = token
184
+
185
+ def __load_arg (self ):
186
+ auth = kw_args .auth
187
+ port = kw_args .port
188
+ ip = kw_args .ip
189
+ token = kw_args .token
190
+ logger .info (f"Auth: { auth } ; Port: { port } ; IP: { ip } " )
191
+ if auth :
192
+ self .__data ["auth" ] = {auth : "all" }
193
+ if port :
194
+ if not isinstance (self .__data .get ("server" ), dict ):
195
+ self .__data ["server" ] = {"ip" : "*" }
196
+ self .__data ["server" ]["port" ] = port
197
+ if ip :
198
+ if not isinstance (self .__data .get ("server" ), dict ):
199
+ self .__data ["server" ] = {"ip" : "*" }
200
+ self .__data ["server" ]["ip" ] = ip
201
+ if token :
202
+ self .__data ["token" ] = token
203
+ #logger.info(f"Final config data: {self.__data}")
204
+
205
+ def __call__ (self , * args ):
206
+ data = self .__data
207
+ default = self .__default
208
+ for key in args :
209
+ if key in data :
210
+ data = data [key ]
211
+ elif key in default :
212
+ data = default [key ]
213
+ else :
214
+ return None
215
+ return data
216
+
217
+ args = Args (default = DEFAULT_DATA )
218
+ ~ args # 初始化配置
195
219
196
220
if __name__ == '__main__' :
197
221
default : dict = {
@@ -202,8 +226,5 @@ def __str__(self):
202
226
"auth" : {}
203
227
}
204
228
config = Args (default = default )
205
- config ()
206
- print (~ config .server )
207
- print (~ config .server .port )
208
- print (~ config .auth )
209
- print (~ config .auth .admin )
229
+ ~ config
230
+ print (config ("server" , "port" ))
0 commit comments