tristan2077 / fastapi-mysql-generator

FastAPI + MySQL Web项目生成器 ;Web application generator. Using FastAPI, MySql as database.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

FastAPI and MySQL - 项目生成器

Python版本 FastAPI版本

中文说明 | English

简介

使用FastAPI + MySql 作为数据库的项目生成器, 我是参考FastAPI作者tiangolo的full-stack-fastapi-postgresql项目做的。

https://github.com/tiangolo/full-stack-fastapi-postgresql

我把它改成了自己喜欢的格式。

demo

功能

  • JWT token 认证。
  • 使用SQLAlchemy models(MySql).
  • Alembic migrations 数据迁移.
  • redis使用演示.
  • 文件上传演示.
  • apscheduler 定时任务 (不保证稳定 noqa)
  • aiocache 装饰器缓存(未实现) tiangolo/fastapi#651

学习博客

项目学习博客点击展开

项目文件组织

参考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 文件夹 (CURD操作和schemas还可以单独放到一个公共的文件夹下,看个人习惯和扩展吧)
| | | | |____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/tristan2077/fastapi-mysql-generator

cd your_project/
# 安装依赖库
pip install -r requirements.txt

# 建议使用 --upgrade 安装最新版 (windows系统下uvloop当前版本可能有问题  https://github.com/MagicStack/uvloop/issues/14)
pip install --upgrade -r requirements-dev.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/

# 直接运行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

About

FastAPI + MySQL Web项目生成器 ;Web application generator. Using FastAPI, MySql as database.


Languages

Language:Python 98.7%Language:Mako 1.3%