Files
FastapiAdmin/backend/main.py
T
zhangtao 88011dff6f refactor(backend): 优化异步函数的执行方式
- 替换 asyncio.run 为 get_event_loop 和 run_until_complete 方法
- 这种方式在某些情况下可能提供更好的性能和灵活性
修改初始化pg数据库windows报错问题
Exceptionignored in: <function ProactorBasePipeTransport. del at 0x0000016F93E27D90>Traceback(most recent call last):File:\Python310\lib\asyncio\proactor_events.py",line 116,indeluC:File"c:\Python31o\lib\asyncio\proactor_events.py",line 108, in closeFile"c:\Python310\lib\asyncio\base_events.py",
"c:\Python31o\lib\asyncio\base_events.py",line 510,in _check_closedFileRuntimeError: EventLoop is closed
2025-03-22 23:51:25 +08:00

110 lines
3.1 KiB
Python
Executable File

# -*- coding: utf-8 -*-
import os
import uvicorn
import typer
from fastapi import FastAPI
from alembic import command
from alembic.config import Config
from app.common.enums import EnvironmentEnum
shell_app = typer.Typer()
# 初始化 Alembic 配置
alembic_cfg = Config("alembic.ini")
def create_app() -> FastAPI:
from app.config.setting import settings
from app.plugin.init_app import (
register_middlewares,
register_exceptions,
register_routers,
register_files,
reset_api_docs,
lifespan
)
# 创建FastAPI应用
app = FastAPI(**settings.FASTAPI_CONFIG, lifespan=lifespan)
# 注册异常处理器
register_exceptions(app)
# 注册中间件
register_middlewares(app)
# 注册路由
register_routers(app)
# 注册静态文件
register_files(app)
# 重设API文档
reset_api_docs(app)
return app
@shell_app.command()
def run(env: EnvironmentEnum = typer.Option(EnvironmentEnum.DEV, "--env", help="运行环境 (dev, test, prod)")):
typer.echo("项目启动中..")
# 设置环境变量
os.environ["ENVIRONMENT"] = env.value
from app.config.setting import settings
# 启动uvicorn服务
uvicorn.run(
app='main:create_app',
**settings.UVICORN_CONFIG
)
@shell_app.command()
def init(env: EnvironmentEnum = typer.Option(EnvironmentEnum.DEV, "--env", help="运行环境 (dev, test, prod)")):
typer.echo("项目初始化中...")
import asyncio
from app.scripts.initialize import InitializeData
# 设置环境变量
os.environ["ENVIRONMENT"] = env.value
# 初始化数据
data = InitializeData()
# 使用asyncio.run来运行异步函数,
loop = asyncio.get_event_loop()
loop.run_until_complete(data.run())
# asyncio.run(data.run())
@shell_app.command()
def revision(message: str, env: EnvironmentEnum = typer.Option(EnvironmentEnum.DEV, "--env", help="运行环境 (dev, test, prod)")):
"""
生成新的 Al
embic 迁移脚本。
"""
os.environ["ENVIRONMENT"] = env.value
command.revision(alembic_cfg, message=message, autogenerate=True)
typer.echo(f"迁移脚本已生成: {message}")
@shell_app.command()
def upgrade(env: EnvironmentEnum = typer.Option(EnvironmentEnum.DEV, "--env", help="运行环境 (dev, test, prod)")):
"""
应用最新的 Alembic 迁移。
"""
os.environ["ENVIRONMENT"] = env.value
command.upgrade(alembic_cfg, "head")
typer.echo("所有迁移已应用。")
if __name__ == '__main__':
# 启动服务
# 方式一:
# uvicorn main:create_app --host 0.0.0.0 --port 8000 --factory --workers 4
# 方式二:
# python main.py run # 启动服务
# python3 main.py run --env=dev(不加默认为dev)
# python main.py init # 初始化数据
# 方式三:(linux部署使用)
# gunicorn -c gunicorn.py main:create_app
# 修改了模型后需要:重新生成迁移文件,然后应用迁移
# 生成迁移
# python main.py revision "初始化迁移" --env=dev(不加默认为dev)
# 应用迁移
# python main.py upgrade --env=dev(不加默认为dev)
shell_app()