使用FastAPI + MySql 作为数据库的项目生成器, 我是参考FastAPI作者tiangolo的full-stack-fastapi-postgresql项目做的。
https://github.com/tiangolo/full-stack-fastapi-postgresql
我把它改成了自己喜欢的格式。
- JWT token 认证。
- 使用SQLAlchemy models(MySql).
- Alembic migrations 数据迁移.
- redis使用演示.
- 文件上传演示.
- apscheduler 定时任务 (不保证稳定 noqa)
- aiocache 装饰器缓存(未实现) fastapi/fastapi#651
项目学习博客点击展开
- 【FastAPI 学习 一】配置文件
- 【FastAPI 学习 二】SqlAlchemy Model模型类
- 【FastAPI 学习 三】 FastAPI SqlAlchemy MySql表迁移
- 【FastAPI 学习 四】 日志配置
- 【FastAPI 学习 五】统一响应json数据格式
- 【FastAPI 学习 六】异常处理
- 【FastAPI 学习 七】GET和POST请求参数接收以及验证
- 【FastAPI 学习 八】JWT token认证登陆
- 【FastAPI 学习 九】图片文件上传
- 【FastAPI 学习 十】使用Redis
- 【FastAPI 学习 十一】 项目目录结构demo(自己改版)
- 【FastAPI 学习 十二】定时任务篇
参考Django文件组织,FastAPI官方推荐项目生成,Flask工厂函数。
点击展开项目文件结构
.your_project
|__alembic // alembic 自动生成的迁移配置文件夹,迁移不正确时 产看其中的env.py文件
| |__versions/ // 使用 alembic revision --autogenerate -m "注释" 迁移命令后 会产生映射文件
| |__env.py // 自动生成的文件
| |__script.py.mako
|__alembic.ini // alembic 自动生成的迁移配置文件
|____api // API文件夹
| |____v1 // 版本区分
| | |____auth/ // auth模块
| | | |______init__.py
| | | |____schemas // auth模块 model
| | | | |____user.py // user验证
| | | |____curd // curd 文件夹
| | | | |____user.py // user curd操作
| | | |____endpoints.py // auth模块接口
| | |____item/ // item模块
| | | |____endpoints.py // 模块接口
| | | |____sys_scheduler.py // 定时任务调度模块
| | |____v1_router.py // V1 API分组路由文件(可在这里按照分组添加权限验证)
| |______init__.py // 生成FstAPI对象 注册各种服务(重要)
| |____common // 项目通用文件夹
| | |______init__.py // 导出日志文件方便导入
| | |____curd_base.py // curd通用基础操作对象
| | |____custom_exc.py // 自定义异常
| | |____deps.py // 通用依赖文件,如数据库操作对象,权限验证对象
| | |____logger.py // 扩展日志 loguru 简单配置
| | |____response_code.py // 响应状态码
|____core
| |____config // 配置文件
| | |______init__.py // 根据虚拟环境导入不同配置
| | |____development_config.py // 开发配置
| | |____production_config.py // 生产配置
| |____celery_app.py // celery (目前没有使用)
| |____security.py // token password验证
| |____db // 数据库
| | |____base.py // 导出全部models 给alembic迁移用
| | |____base_class.py // orm model 基类
| | |____session.py // 链接数据库会话
|____logs/ // 日志文件夹
| |____models // orm models 在这里面新增
| | |____auth.py // 用户模块orm (记得导入到 /db/base.py 下面才会迁移成功)
|____static/ // 静态资源文件(测试时使用,生产建议使用nginx静态资源服务器或者七牛云)
|____tests/ // 测试文件夹
| |____utils // 工具类
| | |____cron_task.py // 定时任务task文件
| | |____tools_func.py // 序列化orm特殊时间(但是感觉不太优雅)
|____jobs.sqlite // 定时任务持久化sqlite 也可以使用其他的比如redis
|____main.py // 启动文件
|____create_user.py // 生成初始化用户
|____requirements.txt // 依赖文件
进入你想要生成项目的文件夹下,并且运行以下命令。
pip install cookiecutter
cookiecutter https://github.com/CoderCharm/fastapi-mysql-generator
cd your_project/
pip install -r requirements.txt
在这个文件下 project/app/core/config/development_config.py
或者 production_config.py
。
配置MySql和Redis信息(如果不需要redis可以去掉,然后在/app/api/__init__.py
文件下注释register_redis
函数)
# 进入项目下
cd your_project/
# 生成关系映射 (第二次生成映射记得修改提交注释 init commit)
alembic revision --autogenerate -m "init commit"
# 生成表 (注意初次生成表会删除其他的表 建议在一个空数据库测试)
alembic upgrade head
迁移由于项目路径可能失败
# 在 alembic/env.py文件里面
import os,sys
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
print(f"当前路径:{BASE_DIR}")
sys.path.insert(0, BASE_DIR)
# 如果还不行,那就简单直接点 直接写固定
# sys.path.insert(0, "/你的路径/you_project/")
cd your_project/app
python create_user.py
# 进入项目文件夹下
cd your_project/app
# 直接运行main文件
python main.py
# 或者 命令行运行(开发模式)
uvicorn main:app --host=127.0.0.1 --port=8010 --reload
可能会出现的常见路径倒入问题
# 如下两种解决方式
# pycharm中设置 标记为sources root
https://www.jetbrains.com/help/pycharm/configuring-content-roots.html#specify-folder-categories
# 命令行中标记为 sources root
https://stackoverflow.com/questions/30461982/how-to-provide-make-directory-as-source-root-from-pycharm-to-terminal
在线文档地址
http://127.0.0.1:8010/api/docs
部署的时候,可以关闭在线文档,见学习文章一配置篇。
在main.py同文件下下启动 去掉 --reload 选项 增加 --workers
uvicorn main:app --host=127.0.0.1 --port=8010 --workers=4
# 同样可以也可以配合gunicorn多进程启动 main.py同文件下下启动 默认127.0.0.1:8010端口 gunicorn需要安装
# 参考http://www.uvicorn.org/#running-with-gunicorn
gunicorn main:app -w 4 -k uvicorn.workers.UvicornWorker -b 127.0.0.1:8010
点击查看托管到后台运行
# 1 如果为了简单省事 可以直接使用 nohup 命令 如下: run.log文件需要自行创建
nohup /env_path/uvicorn main:app --host=127.0.0.1 --port=8010 --workers=4 > run.log 2>&1 &
# 2 可以使用supervisor托管后台运行部署, 当然也可以使用其他的
# supervisor可以参考我总结的文章 https://www.cnblogs.com/CharmCode/p/14210280.html