FastAPI 大型项目模板框架

开发 架构
官方提供了一个项目框架模板,但是由于 FastAPI 自由度比较高,所以大家可以根据自己的习惯去实现一个项目框架,我就根据自己使用 Django 的习惯实现了一个我认为比较合适的框架结构。

[[398990]]

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

关键特性:

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

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

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

简介

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

  • CoderCharm / fastapi-mysql-generator
  • FastAPI-demo

功能

  • JWT token 认证。
  • 使用 Tortoise-orm models(MySql).
  • 基于 casbin 的权限验证
  • loguru 日志模块使用

权限控制

  • 登录、注册及路由中含有openapi的接口不进行登录和权限认证
  1. async def jwt_authentication( 
  2.         request: Request, 
  3.         x_token: str = Header( 
  4.             None, 
  5.             title='登录Token'
  6.             description='登录、注册及开放API不需要此参数' 
  7.         ) 
  8. ): 
  9.     ""
  10.             除了开放API、登录、注册以外,其他均需要认证 
  11.             :param request: 
  12.             :return
  13.             ""
  14.     if 'openapi' in request.url.path.lower() or \ 
  15.             'login' in request.url.path.lower() or \ 
  16.             'register' in request.url.path.lower(): 
  17.         return None 
  18.     .... 

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

  1. app = FastAPI( 
  2.         debug=settings.DEBUG, 
  3.         title=settings.TITLE, 
  4.         description=settings.DESCRIPTION, 
  5.         docs_url=settings.DOCS_URL, 
  6.         redoc_url=settings.REDOC_URL, 
  7.         dependencies=[Depends(jwt_authentication)] 
  8.     ) 

 全局进行 Depends(jwt_authentication) 依赖注入

  • 接口权限认证

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

  1. @router.get( 
  2.     "/info"
  3.     summary="获取当前用户信息"
  4.     name="获取当前用户信息"
  5.     response_model=schema.UserOut, 
  6.     response_model_exclude_unset=True
  7.     dependencies=[Depends(Authority('user,check'))] 

 在接口上添加 Depends(Authority('user,check')) 依赖注入来判断权限

  • 操作权限认证

在接口中进行特殊权限认证,只要使用check_authority函数判断即可,如果无权限会抛出异常

  1. await check_authority(f'{request.state.user.username},auth,add'

配置

配置文件:

core/config/development_config.py 和 production_config.py

修改 API 文档默认地址

为了通过权限认证,将 API 文档地址修改为包含 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 = 'super' 

配置数据库

  1. # 数据库配置 
  2. DATABASE_CONFIG: dict = { 
  3.     'connections': { 
  4.         # Dict format for connection 
  5.         'default''mysql://root:123456@127.0.0.1:3306/testdb' 
  6.     }, 
  7.     'apps': { 
  8.         'models': { 
  9.             # 设置key值“default”的数据库连接 
  10.             'default_connection''default'
  11.             'models': [ 
  12.                 'apps.user.model'
  13.                 'auth.casbin_tortoise_adapter' 
  14.             ] 
  15.         } 
  16.     } 

 数据库使用 Tortoise-orm 库,因为我一直在使用 Django,Django 自有一套 ORM 模型操作,用起来比较方便也比较熟悉,很多人使用 sqlalchemy,我觉得这个不方便,而 Tortoise-orm 是借鉴了 Django ORM 来实现的异步数据库操作库,对于使用了 Django 的人来讲比较友好

运行

  1. # 进入项目目录 
  2. pipenv install 
  3.  
  4. # 进入虚拟环境 
  5. pipenv shell 
  6.  
  7. # 运行服务器 
  8. python run.py 

 【编辑推荐】

 

责任编辑:姜华 来源: 今日头条
相关推荐

2015-08-31 10:11:43

iOS大项目开发

2015-08-26 10:36:32

ios开发漫谈

2022-03-14 10:24:31

编程语言开发

2021-01-13 09:34:45

项目Gson框架

2024-01-22 09:17:35

2012-04-01 15:03:39

大型项目开发者

2021-01-26 05:39:06

项目模块代码

2012-09-23 09:38:13

铁路客票系统

2019-10-10 10:30:26

MVCModelController

2020-09-15 06:13:05

Vue.jsJavaScript框架

2019-12-16 11:16:22

Git子模块项目

2024-02-21 09:32:18

开发架构

2018-01-09 22:18:18

架构阿里巴巴服务器

2020-08-30 14:32:57

Vue.jsJavaScript前端

2024-01-02 10:28:52

FastapiOpenAPI接口

2023-10-09 18:17:52

Python语言Web

2023-08-02 10:39:18

代码React版window

2024-01-02 08:22:01

Koin框架项目

2010-09-13 09:18:22

JavaScript模块模式

2021-10-08 09:57:38

Java开发架构
点赞
收藏

51CTO技术栈公众号