背景与问题
- 学习fastapi作为web开发的后端框架,项目架构设计,数据库设计,依赖管理等。
- 技术栈:vue3、element-plus、fastapi、sqlalchemy、pydantic等。
- 开源项目地址:https://github.com/baizunxian/vue-fastapi-admin
后端架构
项目结构
项目的核心代码都在APP文件夹下,基本目录结构和功能模块如下
app/: 项目核心代码。- apis:包含所有的API路由和处理函数。
- corelibs:包含核心的库函数,如数据库操作、认证等。
- db:包含数据库模型定义、数据库迁移脚本等。
- exceptions:包含自定义的异常类。
- init:包含项目初始化代码,如数据库初始化、环境变量初始化等。
- models:包含数据库模型定义。
- schemas:包含数据验证和序列化的Pydantic模型。
- services:包含业务逻辑层的代码,如用户服务、角色服务等。
- utils:包含常用的辅助函数。
config/:配置文件目录,包含数据库配置、环境变量等。env/:环境变量目录,包含环境变量配置文件。main.py:项目入口文件,包含应用的初始化和启动代码。requirements.txt:项目依赖文件,包含项目运行所需的Python库。
内部依赖结构
- 启动入口
项目启动的时候是从main.py启动。 使用python main.py启动项目。
核心代码:
启动服务使用uvicorn,在main.py中定义了一个
create_app函数。
uvicorn会在启动的时候调用create_app函数,当reload=True时,会在每次修改代码后重新调用create_app函数。
# ... 导入依赖
@asynccontextmanager
async def start_app(app: FastAPI):
""" 注册中心 """
# register_mount(app) # 挂载静态文件
redis_pool.init_by_config(config=config)
init_logger()
logger.info("日志初始化成功!!!") # 初始化日志
yield
await redis_pool.redis.close()
def create_app() -> FastAPI:
app: FastAPI = FastAPI(title="vue-fastapi-admin",
config=config,
description=config.SERVER_DESC,
version=config.SERVER_VERSION,
lifespan=start_app)
init_exception(app) # 注册捕获全局异常
init_router(app) # 注册路由
init_middleware(app) # 注册请求响应拦截
init_cors(app) # 初始化跨域
return app
app = create_app()
if __name__ == '__main__':
uvicorn.run(app='main:app', host="127.0.0.1", port=9100, reload=True)
而 create_app 函数中是一些列初始化和注册的过程,包括异常处理、路由注册、中间件注册、跨域注册等。 使用uvicorn启动:
uvicorn main:app --host 127.0.0.1 --port 8800 --reload
-
异常处理
-
路由注册
-
中间件注册
-
跨域注册
-
数据库mysql
-
redis缓存