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

15 篇文章 31 订阅

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

前言

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

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

框架特点

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

  • 官网 https://fastapi.tiangolo.com/

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

FastAPI文档

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

代码github地址查看我个人博客:

https://www.charmcode.cn/article/2020-06-24_FastAPI_factory

组织代码,写博客不易,导流希望能理解。

FastAPI 项目结构可以根据个人偏好和项目需求来设计,但以下是一种通用的建议结构: ``` project │ ├── app │ ├── __init__.py │ ├── main.py │ ├── routes │ │ ├── __init__.py │ │ ├── user.py │ │ ├── item.py │ │ └── ... │ ├── models │ │ ├── __init__.py │ │ ├── user.py │ │ ├── item.py │ │ └── ... │ ├── services │ │ ├── __init__.py │ │ ├── user.py │ │ ├── item.py │ │ └── ... │ ├── database.py │ ├── config.py │ ├── dependencies.py │ └── utils.py │ ├── tests │ ├── __init__.py │ ├── conftest.py │ ├── test_routes │ │ ├── __init__.py │ │ ├── test_user.py │ │ ├── test_item.py │ │ └── ... │ ├── test_models │ │ ├── __init__.py │ │ ├── test_user.py │ │ ├── test_item.py │ │ └── ... │ ├── test_services │ │ ├── __init__.py │ │ ├── test_user.py │ │ ├── test_item.py │ │ └── ... │ └── test_utils.py │ ├── requirements.txt ├── Dockerfile ├── docker-compose.yml ├── .env └── README.md ``` - `app`: 包含应用程序的主要代码。 - `__init__.py`: 将目录变成包。 - `main.py`: FastAPI 应用程序的入口点。 - `routes`: 包含所有路由的目录。 - `models`: 包含所有数据模型的目录。 - `services`: 包含所有业务逻辑的目录。 - `database.py`: 创建数据库连接的代码。 - `config.py`: 包含应用程序的所有配置。 - `dependencies.py`: 包含应用程序的所有依赖项。 - `utils.py`: 包含应用程序的所有工具函数。 - `tests`: 包含所有测试的目录。 - `__init__.py`: 将目录变成包。 - `conftest.py`: 包含所有测试的配置。 - `test_routes`: 包含所有路由测试的目录。 - `test_models`: 包含所有数据模型测试的目录。 - `test_services`: 包含所有业务逻辑测试的目录。 - `test_utils.py`: 包含所有工具函数测试的文件。 - `requirements.txt`: 包含所有 Python 依赖项的列表。 - `Dockerfile`: 创建 Docker 镜像的文件。 - `docker-compose.yml`: 启动 Docker 容器的配置文件。 - `.env`: 包含应用程序的所有环境变量。 - `README.md`: 应用程序的说明文件。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值