全部文章

使用 FastAPI 构建后端的 API 服务

在现代 web 开发中,API(应用程序编程接口)成为了系统之间交互的核心。API 允许不同的软件应用之间交换数据,它是 前后端,Web 服务、移动应用间沟通的桥梁。

FastAPI 是一个非常不错的框架,它简单高效,适合初学者快速上手。

什么是 API?

API(应用程序编程接口) 是一组定义不同软件组件之间如何交互的规则和协议。API是系统间“对话”的桥梁。比如,当你使用手机应用发送一条消息时,应用程序会向服务器发起一个请求,服务器根据请求返回响应数据。这个过程就通过 API 完成。

API 通常采用 HTTP 协议工作。常见的 HTTP 请求方法包括:

GET:从服务器获取数据。

POST:向服务器发送数据。

PUT:更新服务器上的数据。

DELETE:删除服务器上的数据。

为什么使用 FastAPI?

FastAPI 是一个用于构建 API 服务的 Python 框架。它的优势包括:

高效:FastAPI 基于 Python 的异步特性,能够高效处理大量请求。

自动化:FastAPI 自动生成 API 文档,自动验证请求数据,减少开发者的负担。

易用性:FastAPI 使用 Python 类型注解,代码简洁直观,适合初学者快速上手。

基础概念

在开始编码之前,先了解几个关键概念:

路由(Route:是 API 中用来指定请求路径和处理方法的规则。比如, GET/users 可能表示获取用户列表。

请求(Request)和响应(Response:用户通过 HTTP 请求发送数据,服务器通过响应返回数据。

ASGI 服务器

ASGI 是一种新的 Web 服务器协议,支持异步处理多个请求,适合高并发、实时应用等场景。

  • FastAPI 是基于 ASGI 构建的框架,充分利用异步能力,能够在高并发环境下高效工作。
  • ASGI 服务器(如 Uvicorn)是用于运行 ASGI 应用程序的服务器,能够接收、处理并响应多个并发请求。

准备工作

安装 FastAPI 和 Uvicorn

在使用 FastAPI 构建 API 服务之前,首先需要安装相关的依赖库。你可以使用 pip 来安装它们:

pip install fastapi uvicor

FastAPI 是框架本身。

Uvicorn 是 ASGI 服务器,用于运行 FastAPI 应用。

创建你的第一个 API 服务

现在,我们开始构建一个简单的 API 服务。

代码示例

from fastapi import FastAPI
from pydantic import BaseModel

# 创建 FastAPI 应用实例,这行代码创建了一个 `FastAPI` 应用实例。你可以将 `app`看作是整个 API 服务的核心。
app = FastAPI()


# 定义请求体的数据结构,这里我们定义了一个 Pydantic 数据模型 `ChatRequest`,它包含了一个 `message` 字段,类型是 `str`。Pydantic 是一个用于数据验证的库,FastAPI 使用它来确保请求数据符合预期格式。
class ChatRequest(BaseModel):
    message: str


# 创建路由,处理 POST 请求。`@app.post("/chat")` 是 FastAPI 的装饰器,表示当有用户发送 POST 请求到 `/chat` 路径时,调用 `chat` 函数来处理。
@app.post("/chat")
def chat(chat_request: ChatRequest):
    # 返回响应
    return {"response": f"Received message: {chat_request.message}"}


# 启动 Uvicorn 服务器,这行代码启动了 Uvicorn 服务器,并监听所有网络接口的8000 端口。通过 `http://localhost:8000`,你可以访问这个 API 服务。
if __name__ == "__main__":
    import uvicorn

    uvicorn.run(app, host="0.0.0.0", port=8000)

测试你的 API

运行应用:运行这个文件脚本(其app.py更换为你的文件名):

python app.py

这将启动你的 API 服务。

发送请求:你可以使用 Postman、cURL 或者浏览器访问以下地址:

POST http://localhost:8000/chat

或者在http://localhost:8001/docs#/

它的自动化接口文档平台上面,注意保持格式,只能更改值里面的内容:

image

image

请求体可以是:

{
"message": "你好呀"
}
  1. 查看响应:服务器会返回类似的响应:
{ "response": "Received message: 你好呀" }

image

自动化文档

FastAPI 提供了自动化生成 API 文档的功能。只需要访问以下链接,你就可以查看和测

试你的 API,FastAPI 会自动生成这些文档,让你无需额外编写 API 文档:

Swagger UI 文档

ReDoc 文档

 

 

补充内容

Python网络编程&FastApi的由来

我们经常编写的Python代码程序通常在服务器(后端环境)上运行,处理数据、执行业务逻辑、与数据库等后端服务交互。这种情况下,它是典型的“后端服务”。Python在网络编程领域的发展历程大致经历了从

基本的HTTP服务器和CGI处理,到WSGI标准的制定,再到现在广泛使用的成熟Web框架。具体来看:

早期的HTTP服务器和CGI脚本

最开始,Python与前端的交互方式比较原始且不方便。不过,也存在一些方法和技术可以实现前后端的交互,比如我们在前期会尝试使用:

  • 基本的CGICommon Gateway Interface

Web服务器与后端程序的交互主要通过CGI实现。Python脚本可以作为CGI程序运行,处理HTTP请求数据,执行所需的逻辑,并直接向客户端输出HTML或其他格式的响应。这种方式直接、简单,但效率较低,因为每次HTTP请求都需要启动一个新的进程来处理。

  • 自定义Python服务器

Python的后端开发者会使用Python标准库中的模块(如http.server或更早的SimpleHTTPServer和BaseHTTPServer)来创建简单的HTTP服务器。这些服务器能够接收HTTP请求,然后通过编写Python代码来处理这些请求并返回响应。这种方法提供了很大的灵活性,但通常缺乏用于生产环境的必要特性和安全性。

  • Python模块与库的使用

进一步地,Python可以利用各种库来处理Web请求,如使用 urllib 和 xmlrpc.client 等库编写客户端应用程序。这些库支持与HTTP服务的交互,但主要用于客户端编程,不适合作为服务器端处理HTTP请求。

客户端编程通常指的是在客户端设备上运行的程序的编写和开发,这些设备可以是用户的计算机、手机或任何其他终端设备。客户端程序主要负责与用户直接交互,处理用户界面和用户输入,并可能与远端服务器通信来获取数据或执行任务。

上述方法基本上都是处理HTTP请求并返回响应的简单机制,但通常效率不高、功能有限,且不易于扩展。

为了解决这些问题,并统一Python Web应用与各种Web服务器之间的接口,PEP 333(PythonEnhancement Proposal 333)提出了WSGI(Web Server Gateway Interface)。

WSGI的出现

WSGI的引入是一个重大转变,它定义了一个标准化的接口,使得Web服务器和应用之间的通信更加规范和高效。WSGI允许开发者编写可以与任何支持WSGI的服务器配合工作的应用,从而使Python Web开发更加灵活和强大。WSGI(Web Server Gateway Interface)的设计初衷是为了解决Python Web服务器和应用之间的兼容问题,提供一个标准化的接口。WSGI的主要目的包括:

  1. 标准化接口:在WSGI标准出现之前,Python的Web开发环境相对碎片化,不同的Web框架和Web服务器之间很难直接交互。WSGI提供了一个标准的接口,允许Web服务器和Web应用之间有一个统一的通信协议。这样,开发者就可以选择任何支持WSGI的服务器来部署他们的Web应用,而不用担心底层的兼容性问题。
  2. 简化开发:WSGI使得开发人员可以更专注于应用的开发而不是底层的细节。开发者可以使用任何WSGI兼容的Web框架来开发应用,而无需关心服务器的细节,反之亦然。
  3. 中间件支持:WSGI还支持所谓的“中间件”组件,这些组件可以执行请求和响应的处理任务,如会话管理、认证、数据压缩等。这意味着可以插入额外的功能,而无需改变应用本身的代码。
  4. 可扩展性和可插拔性:WSGI的接口设计允许多种组件(服务器、应用、中间件)之间的灵活组合和匹配,从而使得Web应用的部署和扩展变得更加灵活。

基于WSGI标准,开始出现了更加复杂和功能丰富的Web框架。这些框架如Django、Flask等不仅实现了WSGI接口,还提供了许多开箱即用的功能,如ORM(对象关系映射)、表单处理、模板渲染和会话管理等。这些框架极大地简化了Web应用的开发过程,让开发者可以更专注于业务逻辑而不是底层细节。在WSGI出现之前,不同的Python Web框架(如Django, Flask等)和Web服务器(如Apache, Nginx等)之间的交互通常需要特定的适配器或者中间件,这导致了许多兼容性和效率问题。

  • Django makes it easier to build better web apps more quickly and with less code:https://www.djangoproject.com/
  • Flask provides configuration and conventions, with sensible defaults, to get started:https://flask.palletsprojects.com/en/3.0.x/

WSGI 专注于后端的部分,即如何在 Python 应用程序和 Web 服务器之间建立一个清晰、标准化的接口。这使得开发者可以选择适合他们需求的框架和服务器,而无需担心两者之间的兼容性问题。WSGI应用可以完全后端驱动,也可以仅仅作为前后端分离模式中后端部分的实现。但WSGI(Web Server GatewayInterface)是Python中传统的、同步的Web服务器与应用程序之间的标准接口。框架如Flask和Django(在Django 3.0之前)都使用WSGI。它适合处理不需大量并发处理的应用,但在高并发和实时数据处理方面表现不佳。

异步编程和现代框架

随着网络应用对性能和并发的需求日益增长,出现了支持异步编程的框架,典型框架就是:Starlette和FastAPI。这些框架基于ASGI(异步服务器网关接口),是WSGI的异步版本。它们可以更高效地处理并发请求,允许服务器和应用程序非阻塞方式通信,从而处理异步程序。适合构建需要高性能和大规模并发处理的现代Web应用。

总的来说,Python的网络编程从基本的HTTP服务器和CGI脚本发展到了现在的成熟Web框架,这个过程中WSGI的制定起到了关键的桥梁作用。现代的Web框架不仅提供了丰富的功能和组件,还极大地提高了开发效率和应用性能。

Starlette

Starlette 是一个轻量级的 ASGI(异步服务器网关接口)框架,它提供了构建异步Web应用的基础设施。Starlette 可以单独使用来构建应用程序,也可以作为其他异步Web框架(如 FastAPI)的基础。它提供了许多有用的功能,如请求和响应类、路由系统、中间件支持等。此外,Starlette 也支持WebSocket,是构建实时应用程序的一个好选择。其官方文档:https://www.starlette.io/

Starlettet可以单独使用,用于构建Web应用和服务,包括但不限于:

  • 异步请求处理
  • WebSocket 支持
  • 事件生命周期管理.
  • ....

Starlette 提供了构建现代Web应用所需的基本工具,但它的设计更注重灵活性和性能,不包含一些高层次的抽象。但需要注意的是:Starlette仅仅是一个提供了构建异步 Web 应用所需的各种工具和组件,本身不包含服务器的功能,它需要一个 ASGI 兼容的服务器来运行应用程序。

我们还需要启动Uvicorn、Daphne 和 Hypercorn 这些 ASGI 兼容的服务器,它们用来接收客户端(如Web 浏览器)的网络请求,将这些请求转发给后端的 ASGI 应用(如用 Starlette 构建的应用),并将应用的响应返回给客户端。

Starlettet可以单独使用,用于构建Web应用和服务,包括但不限于:

  • 异步请求处理
  • WebSocket 支持
  • 事件生命周期管理
  • .....

Starlette 提供了构建现代Web应用所需的基本工具,但它的设计更注重灵活性和性能,不包含一些高层次的抽象。但需要注意的是:Starlette仅仅是一个提供了构建异步 Web 应用所需的各种工具和组件,本身不包含服务器的功能,它需要一个 ASGI 兼容的服务器来运行应用程序。

我们还需要启动Uvicorn、Daphne 和 Hypercorn 这些 ASGI 兼容的服务器,它们用来接收客户端(如Web 浏览器)的网络请求,将这些请求转发给后端的 ASGI 应用(如用 Starlette 构建的应用),并将应用的响应返回给客户端。

运行测试请查看上面代码。

FastAPI

FastAPI 和 Starlette 的关系并不是网络编程接口协议与基于该协议的框架的关系,而是两个不同层次的Web框架之间的关系。具体来说,FastAPI 是基于 Starlette 构建的,可以看作是 Starlette 的一个高级封装,提供了更多易用的功能和更丰富的工具集,特别是在创建API服务方面。

Starlette 提供了构建现代Web应用所需的基本工具,但它的设计更注重灵活性和性能,不包含一些高层次的抽象。FastAPI 是一个现代、快速(高性能)的Web框架,用于构建API,基于Python 3.6+ 的类型提示特性,主要优势包括:

  • 自动生成交互式API文档(基于Swagger和ReDoc)
  • 基于Python类型提示的请求参数和响应体的验证
  • 易于使用的依赖注入系统
  • 对异步和同步代码的支持
  • 易于扩展和高性能

FastAPI 在 Starlette 的基础上提供了更多的高级功能,尤其是在自动数据验证、序列化和API文档生成方面。这些功能使得开发复杂的API服务变得更简单、更快速,同时保持了高性能。

因此,可以说 FastAPI 是在 Starlette 的基础上增加了额外的功能和更高层次的抽象,以便更专注于快速API开发。Starlette 提供了底层的异步处理能力和Web功能,而 FastAPI 则利用这些基础构建了更完整的开发框架,特别是为了更好地服务于API开发。这种关系类似于 Flask 和 Flask-RESTful 的关系,后者在前者的基础上增加了便于创建RESTful API的工具和功能。

 

ASGI框架可以支持多种通信模式,如HTTP、HTTP2和WebSocket,因此非常适合实时Web应用、高性能Web应用以及需要高并发处理的场景。
 
几个流行的基于ASGI的Web框架包括:
 
  1. Starlette:一个轻量级的ASGI框架,它旨在成为构建高性能异步服务的基础框架。Starlette 可以独立使用,也可以作为其他框架的基础组件。
  2. FastAPI:建立在Starlette之上的一个现代、快速(高性能)的Web框架,用于构建API。FastAPI强调快速开发、类型安全和自动API文档生成。
  3. Uvicorn:一个轻量级、超快的ASGI服务器,常用于运行ASGI应用。虽然Uvicorn自身不是一个Web框架,但它是运行基于ASGI的框架(如Starlette和FastAPI)的推荐服务器。
 
通过使用这些ASGI框架,开发者可以构建具有出色并发处理能力的应用程序,同时保持代码的简洁和易于维护。
对于FastAPI这个项目来说,当在远程服务器计算机上运行时,借助的是Uvicorn 这样的 ASGI 服务器程序,这是 fastapi 命令中默认提供的程序。
 
当安装 FastAPI(例如使用 pip install fastapi )时,它包含一个名为 fastapi-cli 的包,该包在终端中提供 fastapi 命令。
 
关键的启动信息有两种:
  1. 开发模式:使用 fastapi dev 会读取 指定的启动文件,检测其中的 FastAPI 应用程序,并使用 Uvicorn 启动服务器。默认情况下,它将启用自动重新加载,因此当更改代码时,它将自动重新加载服务器。这是资源密集型的。
  2. 生产模式:使用 fastapi run 代替。默认情况下,它将禁用自动重新加载
 
对于 Web API,通常涉及将其放置在远程计算机中,并使用提供良好性能、稳定性等的服务器程序, 以便用户可以有效地访问应用程序,而不会出现中断或问题。
这与开发阶段形成鲜明对比,在开发阶段,我们是不断更改代码、破坏代码并修复代码、停止并重新启动开发服务器等。
 
但对于在应用系统的构建过程中,我们往往依赖的是:通过传递特殊格式的导入字符串,从而启动 FastAPI 应用程序。即类似于:uvicorn main:app --host 0.0.0.0 --port 8000

 

posted @ 2025-09-28 22:53  指尖下的世界  阅读(2)  评论(0)    收藏  举报