使用现代的接口标准和框架

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 【5月更文挑战第9天】FastAPI是一个基于Python3.6以上版本的类型注解构建的现代化API框架,它提供自动补全和类型检查,数据校验及清晰的错误信息,支持多种输入输出格式,如JSON、路径参数等。利用OpenAPI和JSON Schema自动生成交互式API文档,兼容Swagger UI和ReDoc。FastAPI基于类型注解进行参数校验,内置安全性功能,包括HTTP基本认证和OAuth2。

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进行转换

2 安全性及身份验证

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

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

        请求头
        查询参数
        Cookies 等

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

3 依赖注入

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

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

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

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

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

1.4 无限制 插件

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

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

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

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

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

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

将类声明为变量的类型

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

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

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

7 Pydantic模型

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

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

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

8 FastAPI的 类型提示

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

    编辑器支持
    类型检查

FastAPI还使用这些类型声明

定义参数要求

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

转换数据

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

校验数据

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

使用OpenAPI记录API

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

综上:

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

9 模式

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    

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

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

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

以及更少见的:

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

11 小结

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

目录
相关文章
|
1月前
|
存储 自然语言处理 JavaScript
vben框架是什么
vben框架是什么
51 0
|
1月前
|
前端开发 JavaScript
框架
框架
16 3
|
9月前
|
机器学习/深度学习 计算机视觉
AIGM 框架
AIGM (Adaptive Image Generation and Manipulation) 是一个基于深度学习的图像生成和处理框架。它使用先进的生成对抗网络 (GAN) 和变分自编码器 (VAE) 技术,可以实现图像的自动生成、转换、编辑和增强等功能。
159 8
|
10月前
|
SQL XML 前端开发
1.1 初识框架
思考:框架是什么?我们为什么要学习框架呢?“框架(Framework)”一词最早出现在建筑领域,指的是在建造房屋前期构建的建筑骨架。在编程领域,框架就是应用程序的骨架,开发人员可以在这个骨架上加入自己的东西,搭建出符合自己需求的应用系统。实际开发中,随着业务的发展,软件系统变得越来越复杂,如果所有的软件都从底层功能开始开发,那将是一个漫长而繁琐的过程。此外,团队协作开发时,由于没有统一的调用规范,系统会出现大量的重复功能的代码,给系统的二次开发和维护带来不便。为解决上述问题,框架应运而生。
53 0
|
10月前
|
存储 Java 应用服务中间件
|
11月前
v4l2框架
v4l2框架
88 0
|
11月前
|
IDE Linux 开发工具
C++之openFrameworks框架
openFrameworks(简称 oF)是一个基于C++的开源库。 它提供了丰富的功能库和工具,用于快速开发多媒体、交互性和艺术创作相关的应用程序,如艺术装置、互动艺术、音视频作品、实时图形等。oF 的设计目标是让创意编程变得更加简单、直观和灵活,使艺术家、设计师、创意工作者等能够利用编程进行创作和表达。oF提供了丰富的图形、音频、输入输出、计算机视觉等功能库,并支持跨平台开发,适用于Windows、Mac OSX、Linux等操作系统。oF的社区活跃,有大量的用户和开发者共享和贡献了各种扩展、插件和示例代码。
96 0
|
程序员 测试技术
【提高自己】正确的工作方法,形成自己的思考框架
在学习过程中,将老师的知识用脑图的形式记录下来,在这里做个分享,不足之处欢迎大家指出。
|
传感器
CoreMotion 框架
CoreMotion框架(一)—— 基础理论CoreMotion框架(三)—— 获取陀螺仪数据CoreMotion框架(二)—— 利用加速度计获取设备的方向CoreMotion框架(四)—— 仿摩拜贴纸小球碰撞动画 ...
947 0