首页 > 其他分享 >FastAPI-7:框架比较(Flask、Django及FastAPI)

FastAPI-7:框架比较(Flask、Django及FastAPI)

时间:2024-06-13 18:59:46浏览次数:14  
标签:jsonify Flask FastAPI app who Django

7 框架比较(Flask、Django及FastAPI)

关于一个新的 Web 框架,您可能想知道的第一件事就是如何入门,而一种自上而下的方法就是定义路由(从URL和HTTP方法到函数的映射)。

7.1 Flask

Flask自称是微框架。它提供基本功能,你可以根据需要下载第三方软件包进行补充。它比 Django小,入门时学习起来更快。

Flask是同步的,基于WSGI而不是ASGI。quart的新项目正在复制Flask并添加 ASGI 支持。

让我们从头开始,看看 Flask 和 FastAPI 是如何定义网络路由的。

7.1.1 路径

在顶层,Flask和FastAPI都使用装饰器将路由与网络端点关联起来。在例 7-1 中,我们复制了例 3-11(来自第 3 章),它从 URL 路径中获取要问候的人。

  • FastAPI 路径
from fastapi import FastAPI

app = FastAPI()

@app.get("/hi/{who}")
def greet(who: str):
    return f"Hello? {who}?"

默认情况下,FastAPI 会将 f "Hello? {who}?"字符串转换成 JSON 格式并返回给网络客户端。

  • 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 现在由 < 和 > 限定。在 Flask 中,除非是默认的 GET,否则方法需要作为参数包含在内。因此,这里可以省略 methods=[“GET”],但明确一点总没有坏处。

Flask 2.0 支持FastAPI风格的装饰器,如 @app.get 而不是 app.route。

Flask jsonify() 函数会将其参数转换为 JSON 字符串并返回,同时返回 HTTP 响应头,表明这是一个 JSON 字符串。如果返回的是 dict(而不是其他数据类型),最新版本的 Flask 会自动将其转换为 JSON 并返回。显式调用 jsonify() 适用于所有数据类型,包括 dict。

7.1.2 查询参数

在示例 7-3 中,让我们重复示例 3-15,在该示例中,who 作为查询参数传递(在 URL 中的 ? 后面)。

  • FastAPI 查询参数
from fastapi import FastAPI

app = FastAPI()

@app.get("/hi")
def greet(who):
    return f"Hello? {who}?"
  • Flask 查询参数
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 是一个包含查询参数的 dict。

7.1.3 Body

  • FastAPI Body
from fastapi import FastAPI

app = FastAPI()

@app.get("/hi")
def greet(who):
    return f"Hello? {who}?"
  • Flask Body
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}?")

7.1.4 Header

  • FastAPI Header
from fastapi import FastAPI, Header

app = FastAPI()

@app.get("/hi")
def greet(who:str = Header()):
    return f"Hello? {who}?"
  • Flask Header
from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route("/hi", methods=["GET"])
def greet():
    who: str = request.headers.get("who")
    return jsonify(f"Hello? {who}?")

与查询参数一样,Flask 将请求数据保存在请求对象中。这次是头信息的 dict 属性。头关键字不区分大小写。

7.2 Django

Django 比 Flask 或 FastAPI 更大、更复杂,据其网站介绍,它的目标用户是 “有期限的完美主义者”。其内置的对象关系映射器(ORM)对使用大型数据库后端的网站非常有用。与其说它是一个工具包,不如说它是一个整体。额外的复杂性和学习曲线是否合理取决于您的应用。

虽然Django是一个传统的WSGI应用程序,但3.0版本增加了对 ASGI 的支持。

与Flask 和 FastAPI 不同的是,Django 喜欢在单个 URLConf 表中定义路由(将 URL 与 Web 函数关联,它称之为视图函数),而不是使用装饰器。这使得在一个地方查看所有路由更容易,但当您只查看函数时,就很难看出哪个 URL 与函数相关联。

7.3 其他Web框架功能

  • 表单

所有三个软件包都支持标准 HTML 表单。

  • 文件

所有这些软件包都能处理文件上传和下载,包括多部分 HTTP 请求和响应。

  • 模板

模板语言可让您混合使用文本和代码,对于面向内容的网站(带有动态插入数据的 HTML 文本)而非 API 网站非常有用。最著名的 Python 模板包是 Jinja,Flask、Django 和 FastAPI 都支持它。Django 也有自己的模板语言。

如果你想使用基本 HTTP 以外的网络方法,可以试试这些:

  • 服务器发送事件

根据需要向客户端推送数据。FastAPI (sse-starlette)、Flask (Flask-SSE) 和 Django (Django EventStream) 支持。

  • 队列

ZeroMQ、Celery、Redis 和 RabbitMQ 等外部软件包支持作业队列、发布-订阅和其他网络模式。

  • WebSockets

由 FastAPI(直接)、Django(Django Channels)和 Flask(第三方软件包)支持。

参考资料

7.4 数据库

Flask 和 FastAPI 的基础软件包中不包含任何数据库处理功能,但数据库处理是 Django 的一项关键功能。

您网站的数据层可以在不同级别访问数据库:

  • 直接 SQL(PostgreSQL、SQLite)

  • 直接 NoSQL(Redis、MongoDB、Elasticsearch)

  • 生成 SQL 的 ORM

  • 生成 NoSQL 的对象文档/数据映射器/管理器(ODM)

对于关系数据库,SQLAlchemy 是一个出色的软件包,它包含从直接 SQL 到 ORM 的多个访问级别。这是 Flask 和 FastAPI 开发人员的共同选择。FastAPI 的作者在 SQLModel 软件包中同时使用了 SQLAlchemy 和 Pydantic。对于有大量数据库需求的网站来说,Django 通常是首选框架。它有自己的 ORM 和自动数据库管理页面。虽然有些资料建议让非技术人员使用该管理页面进行日常数据管理,但一定要小心。有一次,我看到一个非专业人员误解了管理页面的警告信息,导致需要从备份中手动恢复数据库。

7.5 框架选择

对于基于 API 的服务,FastAPI 似乎是目前的最佳选择。在快速启动和运行服务方面,Flask 和 FastAPI 大致相当。Django 需要更多的时间来理解,但它提供了许多对大型网站有用的功能,尤其是那些严重依赖数据库的网站。

7.6 其他Python Web框架

目前的三大 Python 网络框架是 Flask、Django 和 FastAPI。在 Google 上搜索 Python Web 框架,你会得到大量建议,在此不再赘述。在这些列表中,有一些可能并不突出,但由于某种原因而令人感兴趣,其中包括以下几个:

  • Bottle:一个快速小巧,轻量级的 WSGI 微型web框架,适合快速验证概念。

  • Litestar:与 FastAPI 类似,基于 ASGI/Starlette 和 Pydantic,但有自己的观点。

  • aiohttp 异步http client/server框架(asyncio)

  • Socketify.py声称具有极高性能

7.6 小结

Flask和Django是流行的 Python 网络框架,不过FastAPI的流行速度更快。这三种框架都能处理基本的网络服务器任务,但学习曲线各不相同。FastAPI有更简洁的语法来指定路由,而且它对ASGI的支持使其在许多情况下比竞争对手运行得更快。

标签:jsonify,Flask,FastAPI,app,who,Django
From: https://www.cnblogs.com/testing-/p/18239212

相关文章

  • 在Django中使用Celery
    首先需要确保安装依赖pipinstallceleryrediseventlet在创建的app文件内添加tasks.py#app01/tasks.pyfromceleryimportshared_task@shared_taskdefsimple_task():print('Taskexecutedsuccessfully')在项目目录下(与settings.py文件同级)添加celery.py......
  • 用fastapi和sse创建流式输出接口
    示例为调用huggingface的大模型,使其流式输出fromfastapiimportFastAPI,RequestimportrequestsimportjsonimportosfrompydanticimportBaseModelfromtransformersimportAutoTokenizer,AutoModelForCausalLM,TextStreamer,TextIteratorStreamerfromsse_star......
  • FastAPI-8:Web层
    8Web层本章将进一步介绍FastAPI应用程序的顶层(也可称为接口层或路由器层)及其与服务层和数据层的集成。一般来说,我们如何处理信息?与大多数网站一样,我们的网站将提供以下方法:检索创建修改替换删除8.1插曲:自顶向下、自底向上、中间向外?(Top-Down,Bottom-Up,Middle-Out......
  • python系列:python fastapi + uvicorn 记录日志的最佳实践,结合nb_log
    pythonfastapi+uvicorn记录日志的最佳实践,结合nb_logpythonfastapi+uvicorn记录日志的最佳实践,结合nb_logpythonfastapi+uvicorn记录日志的最佳实践,结合nb_logpythonfastapi+uvicorn记录日志的最佳实践,要记录对fastapi什么时候请求了什么url和入......
  • django 的安装和启动
    1.pycharm创建project方法与之前selenium相同,需在pycharm终端先pipinstalldjango,然后创建好项目路径,再在终端输入django-adminstartproject项目名称。2.app的创建和说明在项目目录下(与manange.py同级的)的地方打开终端在项目目录下输入pyhtonmanage.pystartappapp01(......
  • FastAPI+MemFire Cloud+LangChain开发ChatGPT应用
    为什么选择这三个组合OpenAI官方SDK是Python,此开发语言首选PythonFastAPI是Python语言编写的高性能的现代化Web框架MemFireCloud提供向量数据库支持,向量数据库是开发知识库应用的必选项MemFireCloud提供Supabase托管,LangChain原生支持SupabaseAPILangChain是AI应用开发......
  • Django学习项目-learning log报错合集(2)
    样式篇stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css:1  Failedtoloadresource:net::ERR_CONNECTION_TIMED_OUTdjango-bootstrap3样式无效按这篇文章进行修改......
  • Django模版
    一、模板视图函数只是返回文本,而在实际生产环境中其实很少这样用,因为实际的页面大多是带有样式的HTML代码,这可以让浏览器渲染出非常漂亮的页面,目前市面上有非常多的模板系统,其中最知名最好用的是DTL和Jinja2。DTL是DjangoTemplateLanguage三个单词的缩写,也就是Django自带的模板......
  • python系列:FastAPI系列 10-路由管理APIRouter
    FastAPI系列10-路由管理APIRouterFastAPI系列10-路由管理APIRouter前言一、路由管理APIRouter二、FastAPI主体总结FastAPI系列10-路由管理APIRouter前言在fastapi中也有类似的功能通过APIRouter来管理一、路由管理APIRouter正在开发一个应用程序或We......
  • 46.django - 多语言配置
    1.Django多语言基础知识多语言站点可以让不同语言的用户更好地使用和理解网站内容,提升用户体验和覆盖范围。为了实现多语言功能,我们将使用Django内置的国际化和本地化支持。我收集了一些知识点整理在这一部分,感兴趣的可以看看。直接跳过此部分也行。也可以看看官方文档:翻译......