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