使用现代方式定义接口

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
应用实时监控服务-应用监控,每月50GB免费额度
应用实时监控服务-用户体验监控,每月100OCU免费额度
简介: 【5月更文挑战第14天】FastAPI是一个现代化的、基于类型的web框架,用于构建API。它支持自动补全和类型检查,提供数据校验并能自动生成清晰的错误消息。 它基于OpenAPI标准,能自动生成交互式Swagger UI和ReDoc文档。 FastAPI内置安全性特性,支持身份验证,如HTTP基本认证和OAuth2。依赖注入系统使得复杂逻辑易于管理,同时兼容Starlette,具备高性能、WebSocket和GraphQL支持。

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

2 安装和使用

  pip install fastapi

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

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

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

:param item:

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

:return:

  自动对JSON进行转换

4 安全性及身份验证

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

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

        请求头
        查询参数
        Cookies 等

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

5 支持依赖注入

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

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

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

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

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

6 无限制 插件

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

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

7 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对象并对它们进行验证和注释,可扩展。

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

8 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 类型 可以看作是字典每个元素的价格

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

将类声明为变量的类型

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

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

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

10 Pydantic模型

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

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

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

11 FastAPI的 类型提示

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

    编辑器支持
    类型检查

FastAPI还使用这些类型声明

定义参数要求

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

转换数据

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

校验数据

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

使用OpenAPI记录API

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

综上:

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

12 模式

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    

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

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

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

以及更少见的:

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

14 小结

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

目录
相关文章
无参函数和有参函数的定义使用方法及其调用
无参函数和有参函数的定义使用方法及其调用
469 0
|
2月前
学习使用如何调用外部函数
学习使用如何调用外部函数
35 8
|
7月前
|
C++
C++ 接口的实现,及作用通俗理解方式
C++中的接口,一般就是指抽象类,是一种用来描述类对外提供的操作、方法或功能的集合——注意,一般只是描述(声明),而不对这些方法或功能进行定义实现,通常在
73 2
|
7月前
|
存储 API
功能定义
功能定义.
238 1
功能定义
定义和声明的区别 以及 内部和外部函数
把建立存储空间的变量声明称定义; 不需要建立存储空间的声明称为声明; c为例, 在函数中出现的对变量的声明(除了用extern声明的以外)都是定义 在函数中对其他函数的声明不是函数的定义 详细见c程序设计-谭浩强 196-197页
71 0
|
JSON JavaScript 开发工具
对象和接口-2:常见用法
本实验将介绍TypeScript中的对象类型的常见用法
对象和接口-2:常见用法
|
Java
CheerpJ调用的两种方式
CheerpJ调用的两种方式
254 0
|
XML Java 数据库连接
EnvironmentAware接口的作用
凡注册到Spring容器内的bean,实现了EnvironmentAware接口重写setEnvironment方法后,在工程启动时可以获得application.properties的配置文件配置的属性值。
289 0
|
存储 程序员 Go
Go基础:接口类型、接口嵌套、空接口、类型判断
Go基础:接口类型、接口嵌套、空接口、类型判断
233 0
Go基础:接口类型、接口嵌套、空接口、类型判断