ZyphrZero commited on
Commit
eeab1f3
·
1 Parent(s): 7555989

✨ feat(main): 引入 Granian 作为服务器,重构主入口文件以支持热重载配置

Browse files

- 更新 main.py,使用 Granian 代替 uvicorn 启动服务器
- 添加热重载配置模块 reload_config.py,定义忽略的目录和文件模式
- 更新 pyproject.toml,替换 uvicorn 依赖为 granian

Files changed (3) hide show
  1. app/utils/reload_config.py +85 -0
  2. main.py +18 -3
  3. pyproject.toml +1 -1
app/utils/reload_config.py ADDED
@@ -0,0 +1,85 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ 热重载配置模块
3
+ 定义 Granian 服务器热重载时需要忽略的目录和文件模式
4
+ """
5
+
6
+ # 忽略的目录列表
7
+ RELOAD_IGNORE_DIRS = [
8
+ "logs", # 忽略日志目录
9
+ "storage", # 忽略存储目录
10
+ "__pycache__", # 忽略 Python 缓存
11
+ ".git", # 忽略 git 目录
12
+ "node_modules", # 忽略 node_modules
13
+ "migrations", # 忽略数据库迁移目录
14
+ ".pytest_cache", # 忽略 pytest 缓存
15
+ ".venv", # 忽略虚拟环境
16
+ "venv", # 忽略虚拟环境
17
+ "env", # 忽略环境目录
18
+ ".mypy_cache", # 忽略 mypy 缓存
19
+ ".ruff_cache", # 忽略 ruff 缓存
20
+ "dist", # 忽略构建分发目录
21
+ "build", # 忽略构建目录
22
+ ".coverage", # 忽略测试覆盖率文件
23
+ "htmlcov", # 忽略覆盖率报告目录
24
+ "tests", # 忽略测试目录
25
+ ]
26
+
27
+ # 忽略的文件模式(正则表达式)
28
+ RELOAD_IGNORE_PATTERNS = [
29
+ # 日志文件
30
+ r".*\.log$",
31
+ r".*\.log\.\d+$",
32
+ # 数据库文件
33
+ r".*\.sqlite3.*",
34
+ r".*\.db$",
35
+ r".*\.db-.*$",
36
+ # Python 相关
37
+ r".*\.pyc$",
38
+ r".*\.pyo$",
39
+ r".*\.pyd$",
40
+ # 临时文件
41
+ r".*\.tmp$",
42
+ r".*\.temp$",
43
+ r".*\.swp$",
44
+ r".*\.swo$",
45
+ r".*~$",
46
+ # 系统文件
47
+ r".*\.DS_Store$",
48
+ r".*Thumbs\.db$",
49
+ r".*\.directory$",
50
+ # 编辑器文件
51
+ r".*\.vscode.*",
52
+ r".*\.idea.*",
53
+ # 测试和覆盖率
54
+ r".*\.coverage$",
55
+ r".*\.pytest_cache.*",
56
+ # 构建文件
57
+ r".*\.egg-info.*",
58
+ r".*\.wheel$",
59
+ r".*\.whl$",
60
+ # 版本控制
61
+ r".*\.git.*",
62
+ r".*\.gitignore$",
63
+ r".*\.gitkeep$",
64
+ # 配置文件备份
65
+ r".*\.bak$",
66
+ r".*\.backup$",
67
+ r".*\.orig$",
68
+ # 锁文件
69
+ r".*\.lock$",
70
+ r".*\.pid$",
71
+ ]
72
+
73
+ # 监视的路径(只监视应用相关代码)
74
+ RELOAD_WATCH_PATHS = [
75
+ "app", # 应用主目录
76
+ "main.py", # 主入口文件
77
+ ]
78
+
79
+ # 热重载配置
80
+ RELOAD_CONFIG = {
81
+ "reload_ignore_dirs": RELOAD_IGNORE_DIRS,
82
+ "reload_ignore_patterns": RELOAD_IGNORE_PATTERNS,
83
+ "reload_paths": RELOAD_WATCH_PATHS,
84
+ "reload_tick": 100, # 监视频率(毫秒)
85
+ }
main.py CHANGED
@@ -1,3 +1,6 @@
 
 
 
1
  """
2
  Main application entry point
3
  """
@@ -7,6 +10,9 @@ from fastapi.middleware.cors import CORSMiddleware
7
 
8
  from app.core.config import settings
9
  from app.core import openai
 
 
 
10
 
11
  # Create FastAPI app
12
  app = FastAPI(
@@ -40,7 +46,16 @@ async def root():
40
  return {"message": "OpenAI Compatible API Server"}
41
 
42
 
43
- if __name__ == "__main__":
44
- import uvicorn
 
 
 
 
 
 
 
45
 
46
- uvicorn.run("main:app", host="0.0.0.0", port=settings.LISTEN_PORT, reload=True)
 
 
 
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+
4
  """
5
  Main application entry point
6
  """
 
10
 
11
  from app.core.config import settings
12
  from app.core import openai
13
+ from app.utils.reload_config import RELOAD_CONFIG
14
+
15
+ from granian import Granian
16
 
17
  # Create FastAPI app
18
  app = FastAPI(
 
46
  return {"message": "OpenAI Compatible API Server"}
47
 
48
 
49
+ def run_server():
50
+ Granian(
51
+ "main:app",
52
+ interface="asgi",
53
+ address="0.0.0.0",
54
+ port=settings.LISTEN_PORT,
55
+ reload=True,
56
+ **RELOAD_CONFIG,
57
+ ).serve()
58
 
59
+
60
+ if __name__ == "__main__":
61
+ run_server()
pyproject.toml CHANGED
@@ -27,7 +27,7 @@ classifiers = [
27
  ]
28
  dependencies = [
29
  "fastapi==0.104.1",
30
- "uvicorn[standard]==0.24.0",
31
  "requests==2.32.5",
32
  "pydantic==2.11.7",
33
  "pydantic-settings==2.10.1",
 
27
  ]
28
  dependencies = [
29
  "fastapi==0.104.1",
30
+ "granian==2.5.2",
31
  "requests==2.32.5",
32
  "pydantic==2.11.7",
33
  "pydantic-settings==2.10.1",