FastAPI从入门到实战(0)——初识FastAPI

2023-11-08

本文主要介绍一下FastAPI是什么,多数内容摘自官网:https://fastapi.tiangolo.com/zh/

FastAPI是什么

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

关键特性:

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

FastAPI特性

基于开放标准

  • 用于创建 API 的 OpenAPI 包含了路径操作,请求参数,请求体,安全性等的声明。
  • 使用 JSON Schema (因为 OpenAPI 本身就是基于 JSON Schema 的)自动生成数据模型文档。
  • 经过了缜密的研究后围绕这些标准而设计。并非狗尾续貂。
  • 这也允许了在很多语言中自动生成客户端代码

自动生成文档

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

  • Swagger UI,可交互式操作,能在浏览器中直接调用和测试你的 API 。
  • 另外的 API 文档:ReDoc

简洁

任何类型都有合理的默认值,任何和地方都有可选配置。所有的参数被微调,来满足你的需求,定义成你需要的 API。

但是默认情况下,一切都能**“顺利工作”**。

验证

  • 校验大部分(甚至所有?)的 Python 数据类型,包括:
    • JSON 对象 (dict).
    • JSON 数组 (list) 定义成员类型。
    • 字符串 (str) 字段, 定义最小或最大长度。
    • 数字 (int, float) 有最大值和最小值, 等等。
  • 校验外来类型, 比如:
    • URL.
    • Email.
    • UUID.
    • …及其他.

所有的校验都由完善且强大的 Pydantic 处理。

安全性及身份验证

集成了安全性和身份认证。杜绝数据库或者数据模型的渗透风险。

OpenAPI 中定义的安全模式,包括:

  • HTTP 基本认证。
  • OAuth2 (也使用 JWT tokens)。在 OAuth2 with JWT查看教程。
  • API 密钥,在:
    • 请求头。
    • 查询参数。
    • Cookies, 等等。

加上来自 Starlette(包括 session cookie)的所有安全特性。

所有的这些都是可复用的工具和组件,可以轻松与你的系统,数据仓库,关系型以及 NoSQL 数据库等等集成。

依赖注入

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

  • 甚至依赖也可以有依赖,创建一个层级或者**“图”依赖**。
  • 所有自动化处理都由框架完成。
  • 所有的依赖关系都可以从请求中获取数据,并且增加了路径操作约束和自动文档生成。
  • 即使在依赖项中被定义的路径操作 也会自动验证
  • 支持复杂的用户身份认证系统,数据库连接等等。
  • 不依赖数据库,前端等。 但是和它们集成很简单。

无限制"插件"

或者说,导入并使用你需要的代码,而不需要它们。

任何集成都被设计得被易于使用(用依赖关系),你可以用和路径操作相同的结构和语法,在两行代码中为你的应用创建一个“插件”。

测试

  • 100% 测试覆盖。
  • 代码库100% 类型注释。
  • 用于生产应用。

Starlette 特性

FastAPIStarlette 完全兼容(并基于)。所以,你有的其他的 Starlette 代码也能正常工作。FastAPI 实际上是 Starlette的一个子类。所以,如果你已经知道或者使用 Starlette,大部分的功能会以相同的方式工作。

通过 FastAPI 你可以获得所有 Starlette 的特性 ( FastAPI 就像加强版的 Starlette ):

  • 令人惊叹的性能。它是 Python 可用的最快的框架之一,和 NodeJSGo 相当
  • 支持 WebSocket
  • 支持 GraphQL
  • 后台任务处理。
  • Startup 和 shutdown 事件。
  • 测试客户端基于 HTTPX。
  • CORS, GZip, 静态文件, 流响应。
  • 支持 Session 和 Cookie
  • 100% 测试覆盖率。
  • 代码库 100% 类型注释。

Pydantic 特性

FastAPIPydantic 完全兼容(并基于)。所以,你有的其他的 Pydantic 代码也能正常工作。

兼容包括基于 Pydantic 的外部库, 例如用与数据库的 ORMs, ODMs。

这也意味着在很多情况下,你可以将从请求中获得的相同对象直接传到数据库,因为所有的验证都是自动的。

反之亦然,在很多情况下,你也可以将从数据库中获取的对象直接传到客户端

通过 FastAPI 你可以获得所有 Pydantic (FastAPI 基于 Pydantic 做了所有的数据处理):

  • 更简单:
    • 没有新的模式定义 micro-language 需要学习。
    • 如果你知道 Python types,你就知道如何使用 Pydantic。
  • 和你IDE/linter/brain适配:
    • 因为 pydantic 数据结构仅仅是你定义的类的实例;自动补全,linting,mypy 以及你的直觉应该可以和你验证的数据一起正常工作。
  • 更快:
    • 基准测试 中,Pydantic 比其他被测试的库都要快。
  • 验证复杂结构:
    • 使用分层的 Pydantic 模型, Python typingListDict 等等。
    • 验证器使我们能够简单清楚的将复杂的数据模式定义、检查并记录为 JSON Schema。
    • 你可以拥有深度嵌套的 JSON 对象并对它们进行验证和注释。
  • 可扩展:
    • Pydantic 允许定义自定义数据类型或者你可以用验证器装饰器对被装饰的模型上的方法扩展验证。
  • 100% 测试覆盖率。

为什么要学FastAPI

最重要就是python香啊,用python能做很多数据处理,然后python的web框架也很多,但是像FastAPI这样灵活简洁的还是极少的。

学完就可以写很多接口了,主要就是写一些API。

网站开发还得是java…


感谢阅读
原文链接:https://blog.jiumoz.com/archives/fastapi-cong-ru-men-dao-shi-zhan-0-chu-shi-fastapi

欢 迎 关 注 博 主 个 人 小 程 序!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FastAPI从入门到实战(0)——初识FastAPI 的相关文章

  • 如何在 Eclipse 中用阿拉伯语读写

    我在 eclipse 中编写了这段代码来获取一些阿拉伯语单词 然后打印它们 public class getString public static void main String args throws Exception PrintS
  • 检查双精度值的等于和不等于条件

    我在比较两者时遇到困难double values using and 我创建了 6 个双变量并尝试进行比较If健康 状况 double a b c d e f if a b c d e f My code here in case of t
  • 如何打印整个字符串池?

    我想打印包含文字的整个字符串池String使用添加的对象intern 就在垃圾收集之前 JDK有没有隐式的方法来进行这样的操作 我们如何检查字符串池 EDIT The comment suggests that there may be a
  • java.lang.Class: 在 java 程序中初始化 log4j 属性文件时出错

    我正在尝试使用 log4j 运行独立的 java 程序 但在调试时收到以下消息 控制台上没有 log4j 相关日志 log Logger 1343 java lang Class ERROR in 18b4aac2 有人可以建议这里出了什么
  • 将链接对象转换为流或集合

    我想迭代堆栈跟踪 堆栈跟踪由可抛出对象组成 其 getCause 返回下一个可抛出对象 最后一次调用 getCause 返回 null 示例 a gt b gt null 我尝试使用 Stream iterable 这会导致 NullPoi
  • Java 泛型/类型调度问题

    考虑以下程序 import java util List import java util ArrayList public class TypeTest public static class TypeTestA extends Type
  • Java 重写 hashCode() 得到 StackOverflowError

    所以我不太熟悉重写 hashCode 并且我似乎在 hashCode 方法中以某种方式进行了一些无限递归 这是我的场景 我有一个 DuplicateCache 类 它是一个缓存对象 用于检查系统中的重复对象 我有一个静态内部类 Duplic
  • 方法断点可能会大大减慢调试速度

    每当向方法声明行添加断点 在 Intellij IDEA 或 Android Studio 中 时 都会出现一个弹出窗口 方法断点可能会大大减慢调试速度 为什么会这样戏剧性地减慢调试速度 是我的问题吗 将断点放在函数的第一行有什么不同 Th
  • Android - 除了普通 SSL 证书之外还验证自签名证书

    我有一个通过 SSL 调用 Web 服务的 Android 应用程序 在生产中 我们将拥有由受信任的 CA 签名的普通 SSL 证书 但是 我们需要能够支持自签名证书 由我们自己的 CA 签名 我已经成功实施了接受自签名证书的建议解决方案
  • PropertySources 中各种源的优先级

    Spring引入了新的注释 PropertySources对于所有标记为的类 Configuration since 4 0 需要不同的 PropertySource作为论证 PropertySources PropertySource c
  • 使用 Java 在浏览器中下载 CSV 文件

    我正在尝试在 Web 应用程序上添加一个按钮 单击该按钮会下载一个 CSV 文件 该文件很小 大小仅约 4KB 我已经制作了按钮并附加了一个侦听器 文件也准备好了 我现在唯一需要做的就是创建单击按钮时下载 csv 文件的实际事件 假设 fi
  • 如何在java中使jpeg无损?

    有没有人可以告诉我如何使用编写 jpeg 文件losslessjava中的压缩 我使用下面的代码读取字节来编辑字节 WritableRaster raster image getRaster DataBufferByte buffer Da
  • jmap - 组织和堆操作会给 jvm 带来开销吗?

    正如标题所述 需要多少开销jmap histo and jmap heap分别带到jvm 如果一个内存敏感的 Java 进程处于OutOfMemory 例如 大约 96 的堆已满 并且无法通过 full gc 清除 其中一项操作是否有可能将
  • 将 RSA 密钥从 BigIntegers 转换为SubjectPublicKeyInfo 形式

    WARNING 最初的问题是关于 PKCS 1 编码密钥 而问题中的实际示例需要SubjectPublicKeyInfo X 509 编码密钥 我目前正致力于在 java 中从头开始实现 RSA 算法 特别是密钥生成方面 现在我的代码可以给
  • ExceptionHandler 不适用于 Throwable

    我们的应用程序是基于 Spring MVC 的 REST 应用程序 我正在尝试使用 ExceptionHandler 注释来处理所有错误和异常 I have ExceptionHandler Throwable class public R
  • 来自客户端的超时 Web 服务调用

    我正在使用 RestEasy 客户端调用网络服务 一项要求是 如果调用运行时间超过 5 秒 则中止 超时调用 我如何使用 RestEasy 客户端实现这一目标 我只看到服务器端超时 即如果在一定时间内未完成请求 Rest Easy 网络服务
  • 如何移动图像(动画)?

    我正在尝试在 x 轴上移动船 还没有键盘 我如何将运动 动画与boat png而不是任何其他图像 public class Mama extends Applet implements Runnable int width height i
  • 如何将实例变量传递到 Quartz 作业中?

    我想知道如何在 Quartz 中外部传递实例变量 下面是我想写的伪代码 如何将 externalInstance 传递到此作业中 public class SimpleJob implements Job Override public v
  • Spring Boot MSSQL Kerberos 身份验证

    目前在我的春季靴子中application properties文件中 我指定以下行来连接到 MSSql 服务器 spring datasource url jdbc sqlserver localhost databaseName spr
  • 尝试使用带有有效购买令牌的 Java Google Play Developer API v3 检索应用内购买信息时出现错误请求(无效值)

    当使用 Java Google Play Developer API 版本 3 并请求有效购买令牌的购买信息时 我收到以下异常 API 调用返回 400 Bad Request 响应以及以下消息 code 400 errors domain

随机推荐