预览
对于使用过Flask,Django的开发人员, 或流行的Python Web框架, 本章将指出 FastAPI 的 异同。 它不会涉及每一个令人痛苦的细节, 因为装订胶不会把这本书粘在一起。 如果您正在考虑迁移,这可能很有用 从其中一个到 FastAPI 的应用程序, 或者只是好奇。
您可能想知道的第一件事 关于一个新的Web框架是如何开始的, 自上而下的方法是定义(从 URL 和方法到函数的映射)。 下一节将比较如何使用 FastAPI 执行此操作 和烧瓶, 因为它们比 Django 更相似, 并且更有可能一起考虑 类似的应用程序。
瓶
称自己为。 它提供了基础知识,您可以将第三方软件包下载到 根据需要补充它。 它比Django小, 入门时学习速度更快。
Flask是同步的,基于WSGI而不是ASGI。 一个名为的新项目正在复制Flask并添加ASGI支持。
让我们从顶部开始,展示 Flask 和 FastAPI 如何 定义 Web 路由。
(待办事项:包括 Web 服务器启动代码)
路径
在顶层,Flask和FastAPI都使用装饰器。 将路由与 Web 终结点关联。 在例 7-1 中, 让我们复制示例 3.2 (从第 3 章开始),它得到了 从 URL 路径问候的人:
快速 API 路径示例
from fastapi import FastAPI
app = FastAPI ()
@app . get ( "/hi/ {who} " )
def greet ( who : str ):
return f "Hello? { who } ?"
默认情况下, FastAPI 转换了那个 f“Hello?{谁}?字符串到JSON 并将其返回到 Web 客户端。
示例 7-2 显示了 Flask 是如何做到的:
烧瓶路径示例
from flask import Flask , jsonify
app = Flask ( __name__ )
@app . route ( "/hi/<who>" , methods = [ "GET" ])
def greet ( who : str ):
return jsonify ( f "Hello? { who } ?" )
请注意,装饰器中的 who 现在以 < 和 > 为界。 在烧瓶中, 该方法需要作为参数包含在内 — 除非它是默认值 GET 。 所以上面的方法=[“GET”]可以在这里省略, 但明确一点也无妨。
注意
Flask 2.0支持FastAPI风格的装饰器,如@app.get 而不是应用程序路由。
Flask jsonify() 函数将其参数转换为 JSON 字符串 并返回它,以及指示 这是JSON。 如果要返回字典(不是其他数据类型), 最新版本的 Flask 将自动转换 它到 JSON 并返回它。 显式调用 jsonify() 适用于所有数据类型, 包括字典。
查询参数
在例 7-3 中,让我们重复例 3.3, 其中谁作为查询参数传递 (在网址中的 ? 之后):
快速API查询参数示例
from fastapi import FastAPI
app = FastAPI ()
@app . get ( "/hi" )
def greet ( who ):
return f "Hello? { who } ?"
示例7-4中的烧瓶等效物为:
烧瓶查询参数示例
from flask import Flask , request , jsonify
app = Flask ( __name__ )
@app . route ( "/hi" , methods = [ "GET" ])
def greet ():
who : str = request . args . get ( "who" )
return jsonify ( f "Hello? { who } ?" )
在 Flask 中,我们需要从请求对象获取请求值。 在本例中,args 是包含查询参数的字典
身体
在例 7-5 中,复制旧例 3-7:
快速 API 主体示例
from fastapi import FastAPI
app = FastAPI ()
@app . get ( "/hi" )
def greet ( who ):
return f "Hello? { who } ?"
烧瓶版本类似于示例 7-6:
烧瓶主体示例
from flask import Flask , request , jsonify
app = Flask ( __name__ )
@app . route ( "/hi" , methods = [ "GET" ])
def greet ():
who : str = request . json [ "who" ]
return jsonify ( f "Hello? { who } ?" )
Flask 将 JSON 输入存储在 request.json 中。
页眉
最后,让我们在示例 3-11 中重复示例 7.7:
快速 API 标头示例
from fastapi import FastAPI , Header
app = FastAPI ()
@app . get ( "/hi" )
def greet ( who : str = Header ()):
return f "Hello? { who } ?"
烧瓶版本是示例 7-8:
烧瓶头示例
from flask import Flask , request , jsonify
app = Flask ( & lowbar ; & lowbar ; name & lowbar ; & lowbar ;)
@app . route ( "/hi" , methods = [ "GET" ])
def greet ():
who : str = request . headers . get ( "who" )
return jsonify ( f "Hello? { who } ?" )
与查询参数一样, 烧瓶将请求数据保存在 请求对象。 这一次,它是标头字典属性。 标头键应该不区分大小写。
(注意:验证;另外,将破折号转换为下划线?
姜戈
比Flask或FastAPI更大,更复杂, 瞄准 “有最后期限的完美主义者”。 其内置的(对象关系映射器) 对于具有主要数据库后端的站点很有用。 它更像是一个整体,而不是一个工具包。 额外的复杂性和学习曲线是否 合理性取决于您的应用。
虽然Django是一个传统的WSGI应用程序, 版本 3.0 添加了对 ASGI 的支持。
Unline Flask 和 FastAPI, Django 喜欢定义路由 (将网址与 Web 函数,它称之为) 在单个 URLConf 表中, 而不是使用装饰器。 这样可以更轻松地在一个地方查看所有路线, 但更难看到关联的 URL 当您只查看函数时,使用函数。
其他 Web 框架功能
在比较上述三个框架的部分中, 我主要比较了如何定义路由。 Web框架也可能在其他领域有所帮助:
- :所有三个包都支持标准 HTML 表单。
- 文件:所有这些包都处理上传和下载, 包括分段 HTTP 请求和响应。
- 模板:可让您混合文本和代码, 并且对于(带有动态插入数据的 HTML 文本)很有用 网站,而不是 API 网站。 最著名的 Python 模板包是 , 它由Flask,Django和FastAPI支持。 Django 也有自己的。
如果要使用基本 HTTP 以外的网络方法:
- :根据需要将数据推送到客户端。 由 FastAPI 支持 (), 烧瓶(), 和Django()。
- 队列:作业、发布-订阅和其他 网络模式并支持 外部软件包,如ZeroMQ,Celery,Redis和RabbitMQ。
- :由FastAPI支持(直接), Django (), 和烧瓶(第三方软件包)。
数据库
Flask 和 FastAPI 不包含任何数据库处理 在其基本包中, 但数据库处理是 Django 的一个关键特性。
您站点的数据层可能会访问位于 不同级别:
- Direct SQL (PostgreSQL, SQLite)
- Direct NoSQL (Redis, MongoDB, ElasticSearch)
- 生成 SQL 的 (对象关系映射器/管理器)
- 生成 (对象文档/数据映射器/管理器) NoSQL
对于关系数据库, 是一个优秀的包,它包括 多个访问级别,从直接SQL到ORM。 这是 Flask 和 FastAPI 开发人员的常见选择。 FastAPI的作者利用了SQLAlchemy和Pydantic。 对于 包, 第12章对此进行了更多讨论。
Django 通常是框架的选择 适用于数据库需求繁重的站点。 它有自己的, 和自动。 尽管一些消息来源建议让非技术人员 使用此管理页面进行日常数据管理, 小心。 我见过一个案例,非专家 误解了管理页面警告消息, 并且数据库需要 从备份手动还原。
第12章更深入地讨论了FastAPI和数据库。
建议
对于基于API的服务,FastAPI似乎是现在的最佳选择。 Flask和FastAPI在获得服务方面大致相等。 快速启动并运行。 Django 需要更多的时间来理解, 但提供了许多用于更大 网站,尤其是那些严重依赖数据库的网站。
其他 Python Web 框架
目前的三大巨头是Flask,Django和FastAPI。 谷歌“python web框架”,你会得到一个 谷歌充满建议, 我不会在这里重复。 一些可能不会在这些列表中脱颖而出, 但由于某种原因而有趣的包括:
- : 一个小(单个 Python 文件)的包, 适合快速验证概念。
- : 类似于FastAPI - 它基于ASGI / Starlette和Pydantic - 但有自己的观点。
- 一个 ASGI 客户端和服务器,带有有用的演示代码。
- : 一个声称性能非常高的新进入者。
回顾
Flask和Django是最流行的Python Web框架, 尽管FastAPI的受欢迎程度增长得更快。 这三者都处理基本的 Web 服务器任务, 具有不同的学习曲线。 FastAPI 似乎有一个更简洁的语法来指定路由, 它对ASGI的支持使其运行速度比其快 在许多情况下是竞争对手。
接下来:让我们建立一个网站。
本文暂时没有评论,来添加一个吧(●'◡'●)