FastAPI 是一个用于构建 API 的现代、快速(高性能)的 web 框架,使用 Python 3.6+ 并基于标准的 Python 类型提示 。
关键特性:
- 快速:可与 NodeJS 和 Go 比肩的极高性能(归功于 Starlette 和 Pydantic) 。最快的 Python web 框架之一 。
- 高效编码:提高功能开发速度约 200% 至 300% 。
- 更少 bug:减少约 40% 的人为(开发者)导致错误 。
- 智能:极佳的编辑器支持 。处处皆可自动补全,减少调试时间 。
- 简单:设计的易于使用和学习,阅读文档的时间更短 。
- 简短:使代码重复最小化 。通过不同的参数声明实现丰富的功能 。bug 更少 。
- 健壮:生产可用级别的代码 。还有自动生成的交互式文档 。
- 标准化:基于(并完全兼容)API 的相关开放标准:OpenAPI (以前被称为 Swagger) 和 JSON Schema 。
熟悉 Flask 的人上手 FastAPI 可能会比较快一些,一个 py 脚本就能搭起来一个网站,但是我们开发项目的时候,肯定不会把所有逻辑都塞在一个脚本里面,因此就需要提供一个像 Django 那样的完整项目框架,业务开发只要按照固定的规则添加就行了 。虽然官方提供了一个项目框架模板,但是由于 FastAPI 自由度比较高,所以大家可以根据自己的习惯去实现一个项目框架,我就根据自己使用 Django 的习惯实现了一个我认为比较合适的框架结构 。下面就是大概的介绍 。
简介【FastAPI 大型项目模板框架】使用FastAPI + MySQL + Tortoise-orm 作为主要数据库操作,项目结构参考GitHub上两个项目:
- CoderCharm / fastapi-mysql-generator
- FastAPI-demo
- JWT token 认证 。
- 使用 Tortoise-orm models(MySql).
- 基于 casbin 的权限验证
- loguru 日志模块使用
- 登录、注册及路由中含有openapi的接口不进行登录和权限认证
async def jwt_authentication(request: Request,x_token: str = Header(None,title='登录Token',description='登录、注册及开放API不需要此参数')):"""除了开放API、登录、注册以外,其他均需要认证:param request::return:"""if 'openapi' in request.url.path.lower() or'login' in request.url.path.lower() or'register' in request.url.path.lower():return None....
- 全局登录认证(除以上接口外,其余接口均进行登录认证)
App = FastAPI(debug=settings.DEBUG,title=settings.TITLE,description=settings.DESCRIPTION,docs_url=settings.DOCS_URL,redoc_url=settings.REDOC_URL,dependencies=[Depends(jwt_authentication)])
全局进行 Depends(jwt_authentication) 依赖注入- 接口权限认证
@router.get("/info",summary="获取当前用户信息",name="获取当前用户信息",response_model=schema.UserOut,response_model_exclude_unset=True,dependencies=[Depends(Authority('user,check'))])
在接口上添加 Depends(Authority('user,check')) 依赖注入来判断权限- 操作权限认证
await check_authority(f'{request.state.user.username},auth,add')
配置配置文件:core/config/development_config.py 和 production_config.py
- 修改 API 文档默认地址
# 文档地址 默认为docsDOCS_URL: str = "/openapi/docs"# 文档关联请求数据接口OPENAPI_URL: str = "/openapi/openapi.json"# redoc 文档REDOC_URL: Optional[str] = "/openapi/redoc"
- 超级管理员
SUPER_USER: str = 'super'
配置数据库# 数据库配置DATABASE_CONFIG: dict = {'connections': {# Dict format for connection'default': 'mysql://root:123456@127.0.0.1:3306/testdb'},'apps': {'models': {# 设置key值“default”的数据库连接'default_connection': 'default','models': ['apps.user.model','auth.casbin_tortoise_adapter']}}}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 2021,排名前 15 的 Vue 后台管理模板
- cad图框怎么套上去怎么利用布局?cad图框怎么套上去模板
- 2021清明节手抄报内容大全图片?打开2021清明节手抄报模板
- 马尾辫|2022夏季韩国发型模板,申敏儿新刘海火了,韩志旼的复古卷更显瘦
- 世界地图ppt模板?世界地图并安装
- JavaScript各种技巧操作
- Node/JavaScript中的模板引擎
- FastAPI入门
- 一套就能用的短视频脚本模板,谁套谁火
- 网页模板建站选择+网站建设教程