-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathconfig.py
More file actions
141 lines (118 loc) · 3.29 KB
/
config.py
File metadata and controls
141 lines (118 loc) · 3.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
import typing as t
from yaml import safe_load
from pydantic import BaseModel, PositiveInt, field_validator
from utils import get_path
class _LoggingConfigModel(BaseModel):
'''
日志配置 Model
'''
level: t.Literal['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'] = 'INFO'
'''
日志等级
- DEBUG
- INFO
- WARNING
- ERROR
- CRITICAL
'''
file: str | None = 'logs/{time:YYYY-MM-DD}.log'
'''
日志文件保存格式 (for Loguru)
- 设置为 None 以禁用
'''
file_level: t.Literal['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL', None] = 'INFO'
'''
单独设置日志文件中的日志等级, 如设置为 None 则使用 level 设置
- DEBUG
- INFO
- WARNING
- ERROR
- CRITICAL
'''
rotation: str | int = '1 days'
'''
配置 Loguru 的 rotation (轮转周期) 设置
'''
retention: str | int = '3 days'
'''
配置 Loguru 的 retention (轮转保留) 设置
'''
ip_header: str | None = None
'''
配置从指定 Header 读取客户端 ip (常用于 cdn / 反代 后)
'''
@field_validator('level', 'file_level', mode='before')
def normalize_level(cls, v):
if v is None:
return v
if not isinstance(v, str):
raise ValueError(f'Invaild log level: {v}')
upper = v.strip().upper()
valid = {'DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'}
if upper not in valid:
raise ValueError(f'Invaild log level: {v}')
return upper
class _FallbackConfigModel(BaseModel):
horizontal: str | None = None
'''
横向图片 url
'''
vertical: str | None = None
'''
竖向图片 url
'''
unknown: str | None = None
'''
其他图片 url
'''
class ConfigModel(BaseModel):
log: _LoggingConfigModel = _LoggingConfigModel()
'''
日志相关配置
'''
fallback: _FallbackConfigModel = _FallbackConfigModel()
'''
当所有 site 都失败时重定向到的 url
- 如为 None 则返回 503 Service Unavailable
'''
node: str = 'default'
'''
节点名称, 用于在多节点部署 (如 CF Tunnel) 的情况下区分响应请求的节点
'''
host: str = '0.0.0.0'
'''
服务监听地址 (仅在直接启动 main.py 时有效)
'''
port: PositiveInt = 9333
'''
服务监听端口 (仅在直接启动 main.py 时有效)
'''
workers: PositiveInt = 1
'''
服务 Worker 数 (仅在直接启动 main.py 时有效)
'''
enable_docs: bool = True
'''
是否启用 /docs (自带文档页面)
'''
root_redirect: str | None = '/docs'
'''
控制根目录将重定向到的 url
- 如为 None 则返回 json {"hello": "imgapi", "version": "xxx"}
'''
region: t.Literal['cn', 'outseas', None] = 'cn'
'''
服务区域设置
- cn: 大陆
- outseas: 海外
- ~~geoip: 使用 geoip 数据库判断~~ TODO https://grok.com/share/c2hhcmQtNA_f0ed67f0-6de3-4525-9b5f-ecda2b0172cc
- None: 不区分区域 (不推荐)
'''
try:
with open(get_path('config.yaml'), 'r', encoding='utf-8') as f:
file = safe_load(f)
load_config_failed = None
except Exception as e:
load_config_failed = e
file = {}
config = ConfigModel.model_validate(file)