使用标准开放框架构建服务

举报
码乐 发表于 2024/03/08 15:39:05 2024/03/08
【摘要】 1 简介FastAPI,更加现代的方式定义类框架简介, 它支持 自动补全 类型检查.数据校验在校验失败时自动生成清晰的错误信息对多层嵌套的JSON对象依然执行校验来自网络的请求的输入数据为python数据类型,包括 JSON 路径参数 查询参数 Cookies 请求头 表单 文件转换输出的数...

1 简介

  • FastAPI,更加现代的方式定义类

框架简介, 它支持 自动补全 类型检查.

数据校验
在校验失败时自动生成清晰的错误信息
对多层嵌套的JSON对象依然执行校验

来自网络的请求的输入数据为python数据类型,包括

        JSON
        路径参数
        查询参数
        Cookies
        请求头
        表单
        文件

转换输出的数据:转换Python数据类型为 网络传输的JSON数据

转换基础Python类型

        str int float bool list 等 为 json
        datetime对象 转为 json对象
        UUID对象转为 Json对象
        数据库模型 自动转为Json对象

自动生成的交互式API文档,包括两种可选用户界面

        Swagger UI
        ReDoc
  • 基于开放标准

用于创建 API 的 OpenAPI 包含了路径操作,请求参数,请求体,安全性等的声明。

使用 JSON Schema (因为 OpenAPI 本身就是基于 JSON Schema 的)自动生成数据模型文档。

经过了缜密的研究后围绕这些标准而设计。并非狗尾续貂。
这也允许了在很多语言中自动生成客户端代码。

  • 自动生成文档
    交互式API文档以及具探索性web界面,因为该框架是基于OpenApi,所以具有很多选项,FastAPI默认自带两个交互式API文档

Swaggeer UI 可交互式操作,能在浏览器中直接调用和测试你的 API,ReDoc

1 安装和使用

  pip install fastapi

1.1 校验 全部基于Python3.6的类型声明

Pydantic 的类型声明 ,此函数讲校验 item是否包括在路径中,其数据类型是否为 int 整型

:param item_id: 请求体 读取为JSON 并

:param item:

  检查是否有必需属性 name 并且值为 str 类型
  检查是否有必需属性 price 并且值为 float 类型
  检查是否有可选属性 is_offer 并且值为 bool 类型

:return:

  自动对JSON进行转换

1.2 安全性及身份验证

集成安全性和身份验证,杜绝数据库或数据模型渗透风险

HTTP基本认证
OAuth2 也就是JWT Token
API 密钥

		请求头
		查询参数
		Cookies 等

加上来自 Starlette 包括 session cookie的所有安全特性
所有的 这些都是可复用的工具和组件,轻松与你 的系统,数据仓库,关系型 以及NoSQL数据库集成。

1.3 依赖注入

FastAPI 使用一个非常简单的,但是强大的 依赖注入系统

依赖也可以有依赖,创建一个层级或者图依赖

所有自动化处理都由框架完成
所有依赖关系都可以从请求中获取数据,并且增加了路径操作约束和自动文档生成。

即使在依赖项中被定义的路径操作也会自动验证。

支持复杂的用户身份认证,数据库连接等不依赖数据库,前端等。 但是与它们集成很简单。

1.4 无限制 插件

或者说,导入并使用你需要的代码,任何集成都被设计得易于使用 用依赖关系。

你可以用与路径操作相同的结构和语法在两行代码中为你的应用创建一个插件。

1.5 Starlette特性

FastAPI 和 Starlette 完全兼容。 FastAPI实际上是 Starlette的一个子类。所以,如果你已经知道或者使用Starlette

大部分功能以相同方式工作。

性能强大 与 NodeJS,GO相当
支持WebSocket
支持GraphQL
后台任务处理
Startup和shutdown操作
客户端基于 requests
支持Session和Cookie
100% 测试覆盖,和类型注释

兼容包括Pydantic的外部库,例如用数据库的ORMs,ODMs这表示你可以将从请求中获得相同对象直接传到数据库。

因为所有验证都是自动的 你也可以将数据库中获取的对象直接传到 客户端

fastapi更简单,没有新的模式定义,或者 micro-language需要学习,python types 与 pydantic 一样的使用方式。

  • IED linter brain 适配

因为pydantic数据结构仅仅是你定义的类的实例,自动补全,linting,mypy,以及你的直觉应该可以和你验证的数据一起正常工作。

更快,基准测试中,pydantic比其他测试库都快

复杂结构的校验,使用分层的Pydantic模型,python typing的List Dict等。

验证器使我们能够简单清楚地将复杂数据模式定义,检查并记录为JSON Schema,可以拥有深度的嵌套JSON对象并对它们进行验证和注释,可扩展。

允许自定义数据类型或你可以用验证器对被装饰模型方法进行扩展 验证。

1.6 typing 容器类型list, tuple,set, dict 可以包含自定义子类型

items:List[str]

这表示变量 items 是一个 list,并且这个列表里的每一个元素都是 str"
如此编辑器 IDE将可以知道它是一个Str,声明 tuple 和 set的方法也一样

from typing import Set, Tuple
def process_items(items_t:Tuple[int, int, str], items_s:Set[bytes]):
	return items_t, items_s

这表示:
变量 items_t是一个 tuple,其中的每个元素都是int类型
变量 items_s是一个set,其中每个元素都是bytes类型

字典声明
定义dict时,需要传入两个子类型,逗号分隔
第一个子类型 声明 dict 所有键
第二个子类型 声明 dict 所有值

	from typing import Dict
	def process_items(prices:Dict[str,float]):
		for item_name, item_price in prices.items():
			print(item_name)
			print(item_price)

变量prices 是一个dict

	这个 dict 的所有键为 str 类型,看着时字典内每个元素的名称
	这个dict 的所有键为float 类型 可以看作是字典每个元素的价格

1.7 将类作为 参数的类型提示

将类声明为变量的类型

假设你有一个名为 Perosn的类,拥有name属性

class Person:
	def __init__(self, name:str):
		self.name = name

def get_person_name(one_person:Person):
	return one_person.name

1.8 Pydantic模型

Pydantic 是一个用以执行是数据校验的Python库。

你可以将数据的结构声明为具有属性的类。

每个属性 都拥有类型,接着你使用一些值来创建这个类的实例,这些值会被校验。
并被转换为适当的类型,在需要的情况下,返回一个包含所有数据的对象。
然后,你将获得这个对象的所有编辑器支持。
如1.7的例子。

1.9 FastAPI的 类型提示

类型提示的声明参数可以获得

	编辑器支持
	类型检查

FastAPI还使用这些类型声明

定义参数要求

    声明对请求路径参数,查询参数,请求头,请求体,依赖等要求

转换数据

    将来自请求的数据转换为需要的类型

校验数据

    对于每一个请求
            数据校验失败时自动生成错误信息 返回给客户端

使用OpenAPI记录API

    然后用于自动生成交互式文档的用户界面。

综上:

	通过使用标志的Python类型,只需要在一个地方声明(而不是添加更多的类,装饰器)FastAPI将为你完成很多工作。

1.10 模式

FastAPI使用定义API的OpenAPI标准将你的所有API转换为 [模式]

模式 是对事物的一种定义或描述,并非具体代码实现,只是抽象的描述。

API 模式

在这种场景下,OpenAPI是一种规定如何定义API模式的规范。
定义在OpenAPI模式将包括你的API路径,以及它们可能使用的参数等。

数据 模式

	模式 这个术语 也可能指的是某些数据 比如JSON结构
	它可以表示JSON的属性机器具有的数据类型,等

OpenAPI和JSON Schema

	OpenAPI为你的API定义API模式。 该模式中包含了你的API发送和接收数据的定义(模式)
	这些定义通过JSON数据模式标准 JSON Schema所生成。

	如果你对元素的OpenAPI模式是什么形式 好奇,其实它只是一个自动生成包含所有 API描述的JSON

访问本地服务的 open api 模式

	http://127..0.0.1:1999/openapi.json	

1.11 路由定义也可以使用多个协议支持的操作

路由定义,你也可以使用其他的操作:

	@app.get()
    @app.post()
    @app.put()
    @app.delete()

以及更少见的:

    @app.options()
    @app.head()
    @app.patch()
    @app.trace()

2 小结

新框架层出不穷,选择自己需要的,下一节我们看看它的路由如何处理。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。