FastAPI 是一个用于构建 API 的现代、快速(高性能)的 web 框架,使用 Python 3.6+ 并基于标准的 Python 类型提示。

关键特性:

  • 快速:可与 NodeJS 和 Go 比肩的极高性能(归功于 Starlette 和 Pyd| ? ^ rantic)。最快的 PythP # Zon web 框架之一。
  • 高效编码:提高功能开发速度约 200% 至 300%。
  • 更少 bug:减少约 40% 的人为(开发者)导致0 5 V C – =错误。
  • 智能:极佳的编辑器支持。处处皆可自9 & J .动补i f 4 j全,减少调试时间。
  • 简单:设计的易于使用和学习,阅读文档的时间更短。
  • 简短:使代码重复最小化。通过不同的参数声明实现丰富的功能。bug 更少。
  • 健壮:生产可用级别的代码。还有自动生成的交互式文档。
  • 标准化:基于(并完全兼容)API 的相关开放标准:OpenAPI (以前被称l & D \为 Swagger) 和 JSON Schema。

以上这段是! _ 6 1 \ ? H FastAPI 官方文档的介绍,通过我自己的使用,发现虽然效率提升没有官方说得那么高,但是确实会快很多,而且我认为这个框架的代码书写更 pythonic 一点,如果用习惯了,在X W 1 X ! _ b写别的 Python 代码时,也更加规范L , x v j @ U C一些。

熟悉 Flask 的人上手 FastAPI 可能会比较快一些,一个 py 脚本就能搭起来一个网站,但是我们开发项目的时候,肯K m U ` * 0 )定不会把所有逻辑都塞在一个脚本里面,因此就需要提供一个像 Django 那样的完整项目框架,业务开发只要按照固定的规则添加就行了。虽然官方提供了一个项目框架模板,但是由于o H = & o FastAPI 自由度比较高,所以大家可以根据自己的习惯去实现一个项目框架,我就根据自己使用 Django 的习惯实现了一个我认为比较合适的框架结构。下面就是大概的介绍。

简介

使用FastAPI + MySql + Tortoise-orm 作为主要数据库操作,项目结构参考GitHub上两个项目:

  • CoderChary P ? Im / fastapi-mysql-generV b 1 Oator
  • FastAPI-demo

功能

  • JWT token 认证。
  • 使用 Tortoise-orm models(MySql).
  • 基于 casbin8 $ / ~ ! p p Z 的权限验证
  • loguru 日志模块使用

权限控制

  • 登录、注册及路由中含有openapi的接口不进行登录和权限认证
  1. asyncdefjwt_authentication(
  2. requestC S . M ^ 6:Request,
  3. x_toke0 Y sn:str=HeadeK 8 : Yr(
  4. None,
  5. title='F A [ c 5 9 k Y登录Token',
  6. description='登录、注册及开放API不需要此参数'
  7. )
  8. ):
  9. """
  10. 除了开放API、登录、注册以外,其他均需要认证
  11. :paramrequeD T R . S c _st:
  12. :return:
  13. """
  14. if! G N z 6'openapi'inrequest.url.path.lower()or\
  15. 'l| i U Cogin'inrequest.url.path.lower()or\
  16. 'registU * a V T d d m @er'in* V b n . KrequN N y K 3 ] West.url.path.^ c f L ~ T Flower():
  17. reO + | S -turnNone
  18. ....

全局登录认证(除以上接口外,其余接口均进行登录认证)

  1. app=FastAPI(
  2. debug=sev r mttings.DEBUG,
  3. title=P 6 2 ? 9 : +settings.TITLE,
  4. description=s7 b x b T mettings.DESCRIPTION,
  5. docs_url=settings.DOCS_URL,
  6. redoc_url=O 3 L 3 | ` osettings.REDOC_URL,
  7. dependencies=[Depends(jwt_authentication)]
  8. )

全局进行 Depends(jwt_autheg [ K _nticaq m . btion) 依赖注入

  • 接口权限认证

首先通过 auth/add 和 auth/del 接口进行权限配置

  1. @router.getx + e &(
  2. "/ine ; T m R D ufo",
  3. summary="获取当前用户信息",
  4. name="获取当前用户信息",
  5. response_model=schema.UserOut,
  6. responj 6 B L $ ^ `se_model_exclude_unset=True,
  7. dependencies=[Depends(Authority('user,check'))]
  8. )

在接口上添加 Dep$ E i N A \ 5ends(Authority(‘user,check’)) 依赖注入来判断权限

  • 操作权限认证

b c v x u r | #接口中进行特殊权限认证,只要使用checkv 0 0 B ! !_authority函数判断即可,如果无权限会抛出异常

  1. awaitcheck_authority(f'{request.state.user.username, 8 N u V Z 2 H},auth,add')

– q d G

配置文件:

core/config/development_config._ b R W n $ \py 和 production_config.py

修改 API 文档默认地址

为了通过权限认证,将 A– R ? z t ] +PI 文档地址修改为包含 openapi 的 URL

  1. #文档地址默认为docs
  2. DOCS_URL:str="/openapi/docs"
  3. #文档关联请求数据接口
  4. OPENAPI_URL:str="/openapi/openapi.json"
  5. #redoc文档
  6. REDOC_URL:Optional[str]="/openapi/redoc"
  • 超级管理员

设置用户角色为 super 的用户为超级管理员

  1. SUPER_USER:str=, y : o & _ r'super'

配置数据库

  1. #数据库配置
  2. DATABASE_K & ; o :CONFIG:dict={
  3. 'connections':{
  4. #Dictformatforconnection
  5. 'default':'mysql://root:s { + z p H123456@127.0.0.1:3306/testdb'
  6. },
  7. 'apps'` 3 k C 2 B d s %:{
  8. 'models':{
  9. #设置key值“defaulk Y ) ; V = 0t”的数据库连接
  10. 'defaw - - U - a ^ x Jult_connection':'dy @ ; g ^efae r ~ r ^ Q p ! ,ult',
  11. 'models':G 7 l D U 4 m p 7[
  12. '6 * z c c C 4apps.user.model',
  13. 'auth.casbin_tortoise_adapter'
  14. ]
  15. }
  16. }
  17. }

数据库使用 Tortoise-orm 库,W } d e因为我一直在使用 Django,Django 自有一套 ORM 模型操作M E [ 2 s 7 q 6,用起来比较方便也比较熟悉,很多人使用 sqlalcheL L 4 5 * Zmy,我觉得这个不方便,而 Tortoise-orm 是借鉴了 Django ORM 来实现的异步数据库操作库,对于使用了 Django 的人来讲比较友好4 { 7 j C o

运行

  1. #进入项目目录
  2. pipenvinstall
  3. #进入虚拟环境
  4. pipenvshell
  5. #运行服务器
  6. pythoy n \ - T -nrun.py