1 概述

  • 之前也使用过 django + django-rest-framework 进行开发,但我始终感觉代码写的不流畅;后来使用 fastapi ,才发觉 web 开发就应该是这样才对。

2 fastapi 项目组织结构

  • 目录结构:
├── apps                    # 应用模块
│   ├── auth                # auth 应用模块
│   │   ├── router          # 路由接口模块
│   │   └── service         # service 模块,与接口模块逻辑分离
│   ├── cmdb
│   │   ├── router
│   │   └── service
│   ├── findata
│   │   ├── router
│   │   └── service
│   ├── task
│   │   ├── router
│   │   └── service
│   └── third
│       ├── router
│       └── service
├── config                   # 配置文件
├── core                     # 核心模块,比如项目所需的通用 crud.py
│   └── security
├── data                     # 数据模块,目前主要存储了测试环境的 sqlite 数据库
├── logs                     # 日志目录
├── scripts                  # 项目所需的脚本目录
├── static
└── utils                    # 工具库模块,主要是外部一些工具库

2.1 目录结构说明

  • 参看上方备注;

2.2 其他要点

  • 建议每个业务模块使用单独的目录,比如 auth、cmdb、findata、task、third 等;通过配置文件决定 fastapi 加载哪些业务模块;
  • crud 建议使用全局的 crud.py,避免重复代码;个别业务需要复杂 sql,可以在 service 目录单独实现;
  • config 目录可以配置一个 .env 文件,用于区分 prod 和 dev 环境;
  • 每个 fastapi 项目建议使用项目目录下的 .venv 目录,用于隔离项目依赖;
  • 服务可以使用 systemd 进行进程管理;
# ln -s /opt/xops/config/xops.service /etc/systemd/system/xops.service
[Unit]
Description=xops service develop with fastapi
After=network.target

[Service]
Type=simple
User=root
Group=root
WorkingDirectory=/opt/xops
ExecStart=/opt/xops/.venv/bin/uvicorn main:app --host 127.0.0.1 --port 18000 --workers 8 --log-config config/uvicorn.json
ExecStop=/bin/kill -s TERM $MAINPID
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

3 fastapi 常用工具库推荐

优先使用 github 中 star 多的工具库;

  • orm : sqlalchemy
  • 身份验证 authentication : passlib + jose
  • 授权控制 Authorization : casbin
  • 异步任务 : celery + redis
  • 部署接口 : ansible-runner