FastAPI 项目结构组织,工厂模式创建

前言

学习Vue的时候,需要接口,而我恰巧也学习了下FastAPI,正好个人项目,试一下这个FastAPI框架。
然而 现在关于FastAPI,搜索资料基本都是官网翻译一下,要么就是官方推荐的
全栈项目生成 https://github.com/tiangolo/full-stack-fastapi-postgresql, 对我目前的需求而言,太大了,而且全程用docker,
对我这个初学FastAPI的新手来说很不友好。于是我自己花了点时间, 详细看了一遍文档。然后自己组织了一遍代码。

项目大了之后,可参考项目生成的目录结构

框架特点

按照国际惯例扯一下(复制一下)

算了,自己看官网把,FastAPI文档,是我目前看起来写得最漂亮的,至少我喜欢那个文档的UI, 还有Django文档UI,再就是各种细节提醒,
从基础到进阶,抛开各种性能不说(我也没测试,只是看别人写的测试文章)。

自带的Swagger交互文档, 集成的pydantic数据验证,用起来是真的香呀!

FastAPI 和 Flask Hello World 的对比

由于FastAPI官网的Demo看起来和Flask一样,所以我就参考Flask创建项目。

  • Flask Hello World 创建一个名字为app.py文件,写入以下代码
# flask 1.x版本 后支持默认返回json数据,不需要jsonify
from flask import Flask

app = Flask(__name__)


@app.route('/')
def hello_world():
    return {"Hello": "World"}


if __name__ == '__main__':
    # Flask推荐命令行启动 flask run
    app.run(host="127.0.0.1", port=8090, debug=True)
  • FastAPI Hello World 创建一个名字为main.py文件,注意名字为main,和启动的名字相对应
from fastapi import FastAPI

app = FastAPI()


@app.get("/")
async def read_root():
    return {"Hello": "World"}

if __name__ == "__main__":
    import uvicorn
    # 官方推荐是用命令后启动 uvicorn main:app --host=127.0.0.1 --port=8010 --reload
    uvicorn.run(app='main:app', host="127.0.0.1", port=8010, reload=True, debug=True)

FastAPI 工厂模式创建应用

首先就是项目组织结构, 直接上目录结构

.
|_FastDemo                      // 主项目文件
| 
|___api
| |_____init__.py               // (重点)创建工厂模式生成app对象, 全局的操作基本在这里配置
| |____v1
| |____database.py              // 数据库对象
| |____schemas.py               // 验证参数       (可放到对应模块内)
| |____models.py                // models模型类型 (可放到对应模块内)
| |____home                     // 项目模块文件
| | |____home.py
| | |______init__.py
| | |____home_backup.py
| |____category
| | |______init__.py
| |______init__.py
| |____profile
| | |____profile.py
| | |______init__.py
| |____goods
|   |____goods.py
|   |____goods_backup.py
|____test                     // 测试用例
| |______init__.py
| |____test_sqlite.py
|____utils                    // 工具类
| |______init__.py
| |___custom_exc.py           // 自定义异常
| |___response_code.py        // 自定义返回的状态码
|____setting                  // 配置文件夹
| |______init__.py            // 根据虚拟环境 导出不同配置
| |____development_config.py  // 开发环境配置
| |____production_config.py   // 生产环境配置
|____extensions               // 扩展文件
| |______init__.py            // 导出扩展文件
| |____logger.py              // 日志配置
|____alembic                  //   alembic  初始化自动生成的 
| |____script.py.mako
| |____env.py
| |____versions
| |____README
|____alembic.ini              // alembic  初始化自动生成的 
|____.gitignore
|____requirements.text        // 依赖文件
|____main.py                  // 项目启动文件
|____mall_data.sql            // mysql insert 数据
|____mall_table.sql           // msyql表格 
|____README.md
|____Pipfile
|____Pipfile.lock

主要在api/init.py文件下,生成FastAPI对象

# 导入对象
from fastapi import FastAPI, Request, status
from api.v1 import api_v1

def create_app():
    app = FastAPI(
        title="CharmCode.cn",
        description="https://www.charmcode.cn",
        version="0.1.1",
        docs_url="/api/v1/docs",  # 自定义文档地址
        openapi_url="/api/v1/openapi.json", # 
        redoc_url=None,   # 禁用redoc文档
    )
    
    # 导入路由, 前缀设置
    app.include_router(
        api_v1,
        prefix="/api/v1/mall",
    )
    
    # 异常捕获
    register_exception(app)
    
    # 跨域设置
    register_cors(app)

    return app