python三大开发框架django、 flask 和 fastapi 对比

本文讲述了什么启发了 FastAPI 的诞生,它与其他替代框架的对比,以及从中汲取的经验。
如果不是基于前人的成果,FastAPI 将不会存在。在 FastAPI 之前,前人已经创建了许多工具 。
几年来,我一直在避免创建新框架。首先,我尝试使用许多不同的框架,插件和工具来解决 FastAPI 涵盖的所有功能。

但是有时候,没有更好的办法,除了创建具有所有这些功能的东西,从以前的工具中汲取最佳创意,并以最佳方式将它们组合起来,使用以前甚至没有的语言功能(Python 3.6+类型提示)。

启发过 FastAPI 的框架

Django

Django 是最流行的 Python 框架,受到广泛信任。它用于构建 Instagram 之类的系统。

它与关系数据库(例如 MySQL 或 PostgreSQL)相对紧密地结合在一起,因此,以NoSQL 数据库(例如 Couchbase,MongoDB,Cassandra 等)作为 django 的主存储引擎并不是一件容易的事。

Django REST Framework

Django REST Framework 是一个非常灵活的框架,用于构建 Web API,以改善 Django 的 API 功能。

Mozilla,Red Hat 和 Eventbrite 等许多公司都使用它。

Django REST Framework 是第一个自动生成 API 文档的框架,自动生成 API 的接口文档是 FastAPI 框架诞生的缘由之一。

注意

Django REST Framework 框架的作者是 Tom Christie ,Tom Christie 也创造了 Starlette和 Uvicorn。FastAPI 正是建立在 Starlette 和 Uvicorn 的基础之上。

启发 FastAPI 地方:有一个自动 API 文档,Web 用户界面可供用户测试。

Flask
Flask 是一种轻量级的框架,它不包括数据库集成,也没有很多的附带的功能,虽然这Django 那里是默认提供的。

这个简单性和灵活的特性允许使用 NoSQL 数据库作为主数据存储。尽管文档在某些方面有所技术性,但它非常简单,因此学习起来相对直观。

它还常用于其他不需要数据库,用户管理或 Django 中预建功能的应用程序。尽管其中许多功能都可以通过添加插件来实现。

各个模块之前的解耦,使之成为一个“微框架”,可以通过扩展为精确地提供所需的东西,这是我想要保留的一项关键功能。

考虑到 Flask 的简单性,它似乎很适合构建 API。接下来要找到的是 Flask的 “ Django REST Framework”。

启发 FastAPI 地方:成为一个微框架。易于混合和匹配所需的工具和零件。拥有一个简单易用的路由系统。

Requests
FastAPI 实际上不是 Requests 的替代工具。它们的适用范围非常不同。实际上,在FastAPI 应用程序内部使用 Requests 是很常见的。

但是,FastAPI 从 Requests 中获得了很多启发。Requests  是一个与API(作为客户端)进行交互的库,而 FastAPI 是一个用于构建 API(作为服务器)的库。它们或多或少地处于相反的末端,彼此互补。Requests  具有非常简单直观的设计,非常易于使用,并具有合理的默认值。但同时,它非常强大且可自定义。

这就是为什么,如官方网站所述:

Requests 是有史以来下载次数最多的Python软件包之一

您的使用方式非常简单。例如,要发出GET请求,您可以编写:

response = requests.get("http://example.com/some/url")

FastAPI 对应的 API 路径操作如下所示:

@app.get("/some/url")
def read_url():return {"message": "Hello World"}

它们使用起来的相似之处如 requests.get(…) 和 @app.get(…)

启发 FastAPI 地方:

拥有简单直观的API。直接,直观地使用HTTP方法名称(操作)。具有合理的默认值,功能强大的自定义。

Swagger / OpenAPI

我想要 Django REST Framework 的主要功能是自动 API 文档。然后我发现 API 文档有一个标准叫 Swagger ,它使用 JSON 或 YAML 来描述。

并且 Swagger API 的 Web 用户界面已经被人创建出来了。因此,能够为 API 生成Swagger 文档将允许自动使用此 Web 用户界面。

在某个时候,Swagger 被授予 Linux Foundation,将其重命名为 OpenAPI。这就是为什么在谈论版本 2.0 时通常会说“ Swagger”,对于版本3+来说是“ OpenAPI”。

启发 FastAPI 地方:
  为API规范采用开放标准,而不是使用自定义架构。并集成基于标准的用户界面工具:
   Swagger UI
  ReDoc

选择这两个是因为它们相当受欢迎且稳定,但是通过快速搜索,您可以找到数十个 OpenAPI 的其他替代用户界面(可以与FastAPI一起使用)。

Flask REST frameworks

有几个 Flask REST frameworks ,但经过调查和试用,我发现,不少项目都停产或放弃,还存在有一些长期的问题,使得它们并不适合解决前面的问题。

Marshmallow

一个由 API 系统所需的主要功能是数据的序列化,就是把数据从编程语言中的对象转称成可以在网络上传输的对象,比如数据库中的数据转换为 JSON 对象。将 Python 中的datetime 对象转为字符串,等等。

另外一个功能就是数据的验证,确保传入的参数是有效的,例如,有些字段是一个 int,类型而不是字符串,这在检测输入数据是非常有用的。

如果没有数据验证,你就必须用手工写代码来完成所有的检查。

这两点功能就是 Marshmallow 所提供的,这些是一个伟大的图书馆,之前我经常使用它。

Marshmallow 产生之前 Python 还没有加入类型提示。因此,定义一个 schema 你需要引入 Marshmallow 特定的 utils 的和类。

启发 FastAPI 地方:
使用代码来定义提供的数据类型和验证的 schema,验证都是自动化的。

FastAPI 使用的框架

Pydantic

Pydantic 是一个库,基于Python类型提示来定义数据验证,序列化和文档(使用JSON模式)。这使其非常直观。它可与 Marshmallow 媲美。尽管在基准测试中它比Marshmallow 更快。并且由于它基于相同的Python类型提示,因此对编辑器的支持非常棒。

FastAPI 使用它来处理所有数据验证,数据序列化和自动模型文档(基于JSON Schema)。

然后,FastAPI 会获取该 JSON Schema 数据并将其放入OpenAPI 中,除此之外它还会执行其他所有操作。

Starlette

Starlette 是一种轻量级的 ASGI 框架/工具包,是构建高性能 asyncio 服务的理想选择。

它非常简单直观。它的设计易于扩展,并具有模块化组件。

它具有:

令人印象深刻的性能。

WebSocket支持。

GraphQL支持。

处理中的后台任务。

启动和关闭事件。

测试基于 requests 的客户端。

CORS,GZip,静态文件,流式响应。

会话和 Cookie 支持。

100% 的测试覆盖率。

100% 类型注释的代码库。

零硬依赖性。

Starlette 是目前测试最快的 Python 框架。只有 Uvicorn 超越了它,Uvicorn 不是框架,而是服务器。

Starlette 提供了所有基本的 Web 微框架功能。但是它不提供自动数据验证,序列化或API 文档。
这是 FastAPI 在顶部添加的主要内容之一,全部基于Python类型提示(使用Pydantic)。以及依赖注入系统,安全实用程序,OpenAPI 模式生成等。

技术细节:ASGI 是 Django 核心团队成员开发的新“标准”。尽管他们正在这样做,但它仍然不是“ Python标准”(PEP)。但是,它已经被多种工具用作“标准”。这可以大大提高互操作性,因为您可以将 Uvicorn 切换到任何其他 ASGI 服务器(例如 Daphne 或 Hypercorn),也可以添加与ASGI兼容的工具,例如 python-socketio。

FastAPI 使用它来处理所有核心 Web 部件。在顶部添加功能。类 FastAPI 本身直接继承Starlette。因此,使用 Starlette 可以执行的任何操作,都可以直接使用 FastAPI 进行。
Uvicorn

Uvicorn 是基于 uvloop 和 httptools 构建的如闪电般快速的 ASGI 服务器。它不是Web框架,而是服务器。例如,它不提供用于按路径进行路由的工具。那是像 Starlette(或FastAPI)这样的框架可以提供的。它是 Starlette 和 FastAPI 的推荐服务器。

FastAPI 推荐它为主 Web服务器运行 FastAPI 应用程序。您可以将其与 Gunicorn 结合使用,以拥有异步多进程服务器。在“ 部署” 部分中查看更多详细信息。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/236843.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Educational Codeforces Round 160 (Rated for Div. 2) A~C

目录 A. Rating Increase 题目分析: B. Swap and Delete 题目分析: C. Game with Multiset 题目分析: A. Rating Increase 题目分析: 因为首部不为零,故我们从第二个字符开始遍历,如果遇到第一个不为‘0’的字符&#xff0…

C#文件操作(一)

一、前言 学习心得:C# 入门经典第8版书中的第20章《文件》 二、操作文件的相关类 在C#应用程序中Syste.IO名称空间包含用于在文件中读写数据的类。在此我列举一下File、Directory、Path、FileInfo、DirectoryInfo、FileSystemInfo、FileSystemWatcher。其中在Syste…

伦敦金交易内地与香港有何区别

伦敦金交易是国际银行间市场层面的现货黄黄金交易,亚洲市场的交易中心在中国香港,现在不管是香港本地还是内地的投资者,都可以在网上开户,通过香港的平台参与伦敦金交易,所得到的服务是同等的、公平的、与国际市场接轨…

理论篇:什么是NPM以及为什么NPM如此重要

📌 NPM,全称是 Node Package Manager,NodeJS 包管理工具 当我们开始现代化前端项目开发时,总是会被告知需要提前安装NodeJS,而且NodeJS软件包不仅仅会在我们的开发设备上安装NodeJS运行环境,同时会附带NPM工…

2. 创建型模式 - 抽象工厂模式

亦称: Abstract Factory 意图 抽象工厂模式是一种创建型设计模式, 它能创建一系列相关的对象, 而无需指定其具体类。 问题 假设你正在开发一款家具商店模拟器。 你的代码中包括一些类, 用于表示: 一系列相关产品&…

一套rk3588 rtsp服务器推流的 github 方案及记录 -03(完结)

opencv 解码记录 解码库使用的时候发现瑞芯微以前做过解码库对ffmpeg和gstreamer的支持 然后最近实在不想再调试Rtsp浪费时间了,就从这中间找了一个比较快的方案 ffmpeg 带硬解码库编译 编译流程参考文献 https://blog.csdn.net/T__zxt/article/details/12342435…

C++11特性:可调用对象以及包装器function的使用

在C中存在“可调用对象”这么一个概念。准确来说&#xff0c;可调用对象有如下几种定义&#xff1a; 是一个函数指针&#xff1a; int print(int a, double b) {cout << a << b << endl;return 0; } // 定义函数指针 int (*func)(int, double) &print…

LeetCode刷题--- 括号生成

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 http://t.csdnimg.cn/6AbpV 数据结构与算法 http://t.csdnimg.cn/hKh2l 前言&#xff1a;这个专栏主要讲述递归递归、搜…

Nginx 实战闲谈第一讲:HTTP协议介绍

基本介绍 1.HTTP含义 HTTP 全称&#xff1a;Hyper Text Transfer Protocol 中文名&#xff1a;超文本传输协议 HTTP就是将用户的请求发送到服务器&#xff0c;将服务器请求到的内容传输回给浏览器&#xff0c;浏览器进行解析&#xff0c;解析后变成便于观看的页面。&#x…

vscode配置node.js调试环境

node.js基于VSCode的开发环境的搭建非常简单。 说明&#xff1a;本文的前置条件是已安装好node.js(具体安装不再赘述&#xff0c;如有需要可评论区留言)。 阅读本文可掌握&#xff1a; 方便地进行js单步调试&#xff1b;方便地查看内置的对象或属性&#xff1b; 安装插件 C…

java:获取线程的Id

JDK 19及以后版本&#xff0c;使用Thread的threadId()方法获取当前线程的Id&#xff08;identifier &#xff09;。这个Id是一个正的长整型&#xff0c;在线程创建的时候产生。这个Id是唯一的&#xff0c;并且在线程的生命周期期间保持不变。 JDK 19以前的版本&#xff0c;使用…

Unity中Shader平移矩阵

文章目录 前言方式一&#xff1a;对顶点本地空间下的坐标进行相加平移1、在属性面板定义一个四维变量记录在 xyz 上平移多少。2、在常量缓冲区进行申明3、在顶点着色器中&#xff0c;在进行其他坐标转化之前&#xff0c;对模型顶点本地空间下的坐标进行转化4、我们来看看效果 方…

Java:将字符串重复多次串接起来输出

String的函数public String repeat(int count)&#xff0c;可以将当前字符串重复count次串接起来输出。 如果字符串是空的&#xff0c;或者count的值是0&#xff0c;那么返回空字符串。 代码示例1&#xff1a; package com.thb;public class Test5 {public static void main(…

CVE-2022-22978 Spring Security越权访问漏洞

简介 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。 Spring Security底层实现为一条过滤器链&#xff0c;就是用户请求进来&#xff0c;判断有没有请求的权限&#xff0c;抛出异常&#xff0c;重定向跳转。 影响版本 S…

【教程】cocos2dx资源加密混淆方案详解

1,加密,采用blowfish或其他 2,自定是32个字符的混淆code 3,对文件做blowfish加密,入口文件加密前将混淆code按约定格式(自定义的文件头或文件尾部)写入到文件 4,遍历资源目录,对每个文件做md5混淆,混淆原始串“相对路径”“文件名”混淆code, 文件改名并且移动到资源目录根…

C#线程的定义和使用方法

引言 在C#编程语言中&#xff0c;线程是一种并发执行的机制&#xff0c;允许程序同时执行多个任务。线程的使用使得我们能够利用计算机的多核处理器&#xff0c;实现程序的并行执行&#xff0c;提高系统的性能和响应能力。本文将详细介绍C#中线程的定义和使用方法&#xff0c;涵…

大数据可视化BI分析工具Apache Superset结合内网穿透实现远程访问

文章目录 前言1. 使用Docker部署Apache Superset1.1 第一步安装docker 、docker compose1.2 克隆superset代码到本地并使用docker compose启动 2. 安装cpolar内网穿透&#xff0c;实现公网访问3. 设置固定连接公网地址 前言 Superset是一款由中国知名科技公司开源的“现代化的…

Flask ImportError: DLL load failed: 找不到指定的模块。

一、anaconda环境 将anaconda3安装路径下DDL目录中的 libcrypto-1_1-x64.dll 和 libssl-1_1-x64.dll 拷贝到 虚拟环境目录下的DLL中 完美解决 成功了给个赞吧&#xff01;

三大主流前端框架介绍及选型

在前端项目中&#xff0c;可以借助某些框架&#xff08;如React、Vue、Angular等&#xff09;来实现组件化开发&#xff0c;使代码更容易复用。此时&#xff0c;一个网页不再是由一个个独立的HTML、CSS和JavaScript文件组成&#xff0c;而是按照组件的思想将网页划分成一个个组…

智能优化算法应用:基于未来搜索算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于未来搜索算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于未来搜索算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.未来搜索算法4.实验参数设定5.算法结果6.…