Python REST API 教程——开始使用FastAPI

1,388 阅读6分钟

REST API是一种创建网络服务的架构模式。REST是一套规则,概述了客户端和服务器之间共享数据的最佳做法。它们使用HTTP请求来操作数据并与网络服务进行通信。REST APIs是无状态的,可缓存的,并且是一致的。它们非常适用于构建通用的、可扩展的网络应用。三个主要的Python框架是Django、Flask和FastAPI。

今天,我们将探讨FastAPI,一个用于用Python构建API的开源Web框架。

让我们开始吧!

什么是FastAPI?

FastAPI官方网站将FastAPI描述为一个现代的、高性能的网络框架,用于用Python 3.6+构建基于标准Python类型提示的API。由于FastAPI开箱即用,支持Python 3.6+的async 功能,因此速度非常快。

FastAPI于2018年发布,它是由Sebastián Ramírez创建的。Ramírez对Flask和DRF等现有框架不满意,所以他使用Starlette和Pydantic等工具创建了自己的框架。现在,许多大型科技公司,如Uber、Netflix和微软,都在使用FastAPI来构建他们的应用程序。

FastAPI的特点

FastAPI有许多伟大的功能,让我们来看看它们:

  • 高性能:顾名思义,FastAPI是快速的。它被认为是目前最快的Python框架之一。

  • 稳健:你可以使用自动交互式文档创建生产就绪的代码。

  • 直观:FastAPI被设计为易于使用和学习。它提供了很好的编辑器支持和文档。

  • 快速编码:FastAPI将你的开发速度提高了200%-300%。

  • 更少的bug:它减少了大约40%的诱导性错误。

  • 兼容:它与APIS、OpenAPI(以前称为Swagger)和JSON模式的开放标准合作良好。

  • 插件:你可以使用依赖性注入轻松创建插件。

  • 类型提示:你可以使用类型提示进行数据验证和转换。

Flask与FastAPI

在本节中,我们将探讨Flask和FastAPI。我们将讨论它们的优点、缺点和用例。

Flask

Flask是一个Python微框架。它自带ORM、缓存和认证。它被设计为使用Python构建Web应用程序。它被认为是简单、快速和可扩展的。

优点

  • 灵活:你可以操纵Flask的大部分方面。
  • 直观:Flask很适合初学者,因为它很简单。
  • 内置开发服务器:这种内置的功能,加上它的集成支持,可以实现无缝单元测试。

缺点

  • 没有数据验证:使用Flask,你可以传递任何数据类型。这可能会导致程序经常崩溃。
  • 时间:它有一个轮流处理请求的单一来源,这意味着可能需要一些时间来处理请求。

使用案例

Flask通常用于以下项目:

  • 电子商务系统
  • 社交媒体机器人
  • 社交网络
  • 静态网站

FastAPI

FastAPI是一个现代的、高性能的网络框架。它被用来构建网络API。

优点

  • 数据验证:它甚至在嵌套的JSON请求中也能验证你的数据类型。
  • 异常处理:使用FastAPI,很容易进行异常处理。
  • 支持异步代码:它支持使用async/await Python关键字的异步代码。

缺点

  • 请求验证:FastAPI使用Pydantic进行请求验证。这个过程并不总是非常直观的,而且有时需要你编写自己的自定义验证器。
  • 较小的社区:由于该框架仍然很新,因此与其他框架相比,社区较小。

使用案例

FastAPI通常用于以下项目:

  • 内部危机管理

  • 部署机器学习模型

  • 为网络应用程序创建账户、登录和认证

FastAPI 你好世界

让我们对FastAPI进行一些练习吧!我们将看一下一个简单的Hello World! ,并将其分解:

from fastapi import FastAPI
 
app = FastAPI()
 
@app.get("/")
def root ():
  return {"message": "Hello World!"}

hello.py

为了启动服务器,我们需要运行以下命令:

uvicorn main:app --reload

让我们把它分解一下:

  • main:指的是文件名
  • app: 指的是在hello.py文件中创建的FastAPI 的对象
  • --reload: 指的是参数,使服务器在代码改变后重新启动

让我们来分解一下我们的Hello World! 代码:

  • 第1行:我们导入FastAPI ,它是一个Python类,提供API的所有功能。

  • 第3行:我们创建一个FastAPI 类的实例,并将其命名为app 。 这就是上面命令中uvicorn 所指的app

  • 5行:我们创建一个GET 路径。

  • 6行:我们定义一个函数,当有人访问上述路径时,该函数将被执行。

  • 7行:每当路径被访问时,我们向客户返回一个响应。

基本的FastAPI构建块

让我们来探讨FastAPI的一些构建模块,包括路径参数、查询参数和请求体。

路径参数

路径参数有助于将API调用的范围缩小到单个资源,这意味着你不必为像资源查找器这样简单的事情建立一个主体。

这些参数用大括号{} ,它们为你提供了一种控制特定资源表现的方法。它们被放在查询字符串之前和端点的路径中。

让我们来看看如何使用它们:

from fastapi import FastAPI
 
app = FastAPI()
 
@app.get("/courses/{course_name}")
def read_course(course_name):
  return {"course_name": course_name}

路径参数course_name 的值将作为参数course_name ,传递给函数read_couse()

查询参数

查询参数是可选的。在FastAPI中,没有作为路径参数的一部分声明的函数参数会被自动解释为查询参数。

让我们看一下一些示例代码:

from fastapi import FastAPI
 
app = FastAPI()
 
course_items = [{"course_name": "Python"}, {"course_name": "SQLAlchemy"}, {"course_name": "NodeJS"}]
 
@app.get("/courses/")
def read_courses(start: int, end: int):
    return course_items[start : start + end]

查询是URL中问号? 后面的一组键值对,用安培号&

看一下下面这个URL:

http://localhost:8000/courses/?start=0&end=10

它的查询参数是:

start 值为 , ,值为 。0 end 10

在代码的第8行,我们传递了我们的API所期望的两个查询参数。

请求主体

请求主体是由客户发送给你的API的数据。为了在FastAPI中声明一个,我们可以使用Pydantic模型。

让我们来看看我们如何做到这一点的一个例子:

from typing import Optional
from fastapi import FastAPI
from pydantic import BaseModel
 
class Course(BaseModel):
    name: str
    description: Optional[str] = None
    price: int
    author: Optional[str] = None
 
app = FastAPI()
 
@app.post(“/courses/”)
def create_course(course: Course):
    return course

让我们把它分解一下:

  • 第1-3行:我们导入所需的包。

  • 第5行:我们声明请求数据模型。

  • 11行:我们创建一个FastAPI 类的实例。

  • 13行:我们创建一个POST 路径。

  • 14行:我们将请求数据模型添加到路径中。

接下来要学习的内容

祝贺你迈出了使用FastAPI的第一步!FastAPI是一个用于Python的较轻的网络框架。它允许你轻松、快速、高效地构建API。如果你对网络应用程序开发感兴趣,学习FastAPI会让你走在前面。为了适应这个框架,我们建议你深入研究这个框架,并在一些项目中工作。

接下来推荐的一些主题是:

  • 并行处理
  • 使用GitHub将你的API部署到云端
  • 默认参数和可选参数
  • 等等。