使用 Django REST Framework 创建 REST API | Django REST Framework 教程

2025年3月17日 | 阅读13分钟

在本教程中,我们将学习一种流行且广泛使用的行业标准数据交换格式——REST API。它是最常用的数据交换技术。我们将解释如何使用 Django 在 Python 中创建 REST API。在深入探讨此主题之前,让我们了解 REST 的概念以及它与传统格式的区别。了解 REST 将有助于更好地掌握它。让我们简要介绍一下 REST API。

什么是 REST API?

REST 是 Representational State Transfer(表征状态转移) 的缩写,它是一种向其他应用程序提供数据的标准化方式。换句话说,它用于构建和与 Web 服务进行通信。它是跨应用程序传输数据的最佳方式,并且可以被应用程序使用。它要求 Web 上的资源以 JSON、HTML 或 XML 格式表示。有时 API 用于其他应用程序来更改数据。

API 是 Application Programming Interface(应用程序编程接口)的缩写,它是一个定义不同软件组件之间交互的接口。Web API 确定对组件发出的确切请求。例如,我们定义一个端点来获取特定分支的学生列表。它还用于如何发出请求及其预期响应。

以下是一些重要的 REST API 请求方法。

  • GET 它是从组件获取数据最常用的方法。它根据我们访问的端点和我们传递的任何参数从 API 返回一些数据。
  • POST 它创建新记录并在数据库中更新新创建的记录。
  • PUT 它在给定的 URI 处接收新记录。如果记录存在,则更新记录。如果记录不可用,则创建新记录。
  • PATCH 它在给定的 URI 处接收一个或多个字段。它用于更新一个或多个数据字段。如果记录存在,则更新记录。如果记录不可用,则创建新记录。
  • DELETE 它删除给定 URI 处的记录。

通常,API 是数据库的窗口。API 负责根据数据库查询获取或更新记录。我们以 JSON 格式接收静态响应。

REST API 在软件开发中如此常用,以至于它是开发人员最需要和最重要的技能。API 是应用程序相互之间甚至自身内部进行通信的方式。

许多应用程序都依赖于 REST API。例如,REST API 允许前端与后端通信。例如,如果我们使用 Django 后端部署应用程序,我们将需要一个 API 来允许 React 使用数据库中的信息。

我们将通过实践更多地了解 REST API。现在让我们介绍一下 Django REST Framework。

什么是 Django Rest Framework?

Django Rest Framework (DRF) 是一个构建在 Django 之上的包,用于创建 Web API。它提供了 Django 最广泛的功能,即对象关系映射器 (ORM),它允许以 Pythonic 方式与数据库进行交互。

因此,Python 对象无法通过网络发送,所以我们需要将 Django 模型翻译成其他格式,如 JSON、XML,反之亦然。这个过程被称为序列化,Django REST Framework 使其变得超级容易。

DRF 允许我们以 REST API 的形式表示其功能 Django 应用程序。这相当容易做到。

如果您想深入了解 DRF,您可以阅读如何使用核心 Django 框架创建 REST API。

Django Rest Framework 入门

我们知道 Django 是一个流行的 Web 框架,以快速开发安全且可扩展的 Web 服务而闻名。我们的第一步是创建虚拟环境并在其中安装所有依赖项。让我们创建虚拟环境。

python3 n venv myenv

现在我们需要通过进入环境内的 scripts 目录并运行以下命令来激活它。

在 Mac 或 Linux 上

在 Windows 上

现在,通过 pip 命令安装 django

我们已经准备好创建 Django 项目和应用程序。

我们已经创建了一个项目和一个应用程序;它必须在 settings.py 文件中注册。此外,将 rest_framework 添加到应用程序列表中,让 Django 知道我们将使用 Django REST Framework。

注册应用程序后,我们可以迁移(初始化数据库)并创建一个超级用户来跟踪数据库。

现在,输入所需详细信息并创建超级用户。我们已准备好启动可以接受请求的服务器。

使用 DRF 在 Django 中创建 REST API

我们已经设置好 Django 项目;现在,我们可以开始开发领域模型和业务逻辑了。

首先,我们创建简单的学生模型来表示学生详细信息。在 sample_app/model.py 文件中,我们定义了我们的模型。

sample_app/models.py

我们创建了模型,并将其注册到 Django。为了使其在管理面板中可见,我们将在 sample_app/admin.py 中添加以下行。

我们的新模型已注册。我们需要 makemigration 以将 Student 表反映到数据库中。在终端中运行以下命令。

这里我们可以使用我们的模型。Web 应用程序经常将模型数据从一端传输到另一端。

现在我们来实现 DRF 最有用的功能之一,即 序列化器。让我们对序列化器有一个基本的了解。

什么是序列化器?

序列化器用于以 JSON 格式表示模型数据并将对象实例转换为更可传输的格式。它使从我们的 API 解析数据的过程变得容易。另一方面,反序列化器将 JSON 数据转换为我们的模型作为对象实例。

我们将在 sample_app 中创建 serializers.py 文件,在发送响应之前将模型对象转换为 JSON 格式。

serializers.py

serializers.py 与 Django 中的 Form 类文件非常相似,并且包含各种字段的验证标志,例如 required、max_length 和 default。在上面的代码中,我们指定了所有必填字段,如果用户未提供任何字段,它将抛出错误。为了避免错误,我们可以传递默认值。

我们使用了 Modelserializer 类,它与 Django 中的 ModelForm 类相同。序列化器也可以使用 Serializers 类创建。

正如我们所看到的,有两个方法 create()update() 来定义在调用 .save() 方法时如何创建或修改完整实例。我们可以使用其中任何一种方法来创建序列化器。

创建视图

DRF 允许我们为 API 创建基于类和基于函数的视图。我们将创建基于类的视图。

我们将使用 APIView 类,它是 Django View 类的子类。我们可以定义 get()、post()、patch() 和 delete() 方法,以便执行 CRUD 操作。

sample_app/views.py

如我们所见,首先,我们从数据库中获取所有记录并使用 StudentSerializers 对它们进行序列化。在 post() 方法中,我们使用 StudentSerializer 从 request.data 创建了序列化对象。POST 请求将数据发送到包含在请求正文中的服务器。它用于在数据库中创建新记录。is_valid() 方法在请求数据有效时返回 True,并调用 save() 方法创建新记录。如果返回 False,它将抛出错误。

响应必须使用要返回的数据进行初始化。此数据可以是任何类型的 Python 对象(如布尔值、字符串、字典等)的实例。

为视图设置端点

首先,我们需要使用以下代码将应用程序端点初始化到项目的 urls.py 中。

config/urls.py

我们可以将 StudentView 类注册为用户的视图。添加此类的目的不是为了实现它,而是为了作为请求处理程序。

让我们为 get()post() 方法创建端点。这需要在 sample_app 文件夹中创建 urls.py 文件。我们将在 sample_app/urls.py 文件中添加以下代码。

sample_app/urls.py

在上面的代码中,path() 的第一个参数表示我们的视图应该可访问的子路径,第二个参数是我们创建在 views.py 文件中的类名。

现在我们准备好使用我们的 API 了。

运行 Runserver

现在,我们运行服务器并使用我们创建的 api/basic/ 端点。

当我们访问本地服务器 http://127.0.0.1:8000/ 时,它将显示我们的端点,我们可以在其中检查我们定义的端点。

http://127.0.0.1:8000/api/basic/ 是测试 get() 和 post() 方法的实际路径。首先我们验证 get() 方法。

该视图处理 get() 请求并以 JSON 格式向客户端返回可用数据。

让我们测试 POST 端点。post() 将从用户那里获取数据并将其作为新记录添加到数据库中。DRF 生成自动生成的 browsable API。

Create REST API using Django REST Framework | Django REST Framework Tutorial

在这里,我们将传递允许我们向端点发送 POST 请求的输入字段。

新数据已添加到数据库中,这意味着我们的 POST 方法运行良好。

现在我们获取数据;它将在浏览器中显示完整结果。

请求数据验证

如果我们缺少任何必需的数据或输入错误的条目怎么办?例如,为学号输入一个字符串,而学号被定义为整数。让我们看下面的例子。

输入

输出

{
"status": "error",
"data": {
"roll_number": 
[
"A valid integer is required"
]
}
}

它会抛出错误,因为我们为 roll_number 传递了错误的类型值。自动数据验证是 DRF 的一个优秀功能。它会抛出错误,因为我们为 roll_number 传递了错误的类型值。如果我们遗漏任何字段,它将显示以下错误。

但是,我们也可以通过自定义验证器定义自定义验证规则。

修改 Get 请求处理程序

在之前的 GET 请求示例中,我们获取了表中存在的所有记录。我们也可以通过传递其 id 作为参数来从表中检索特定实体。我们获取单个记录并将其传递给 StudentSerializer(),这次我们将不传递 many=True,因为我们正在传递单个记录。我们将代码更改如下。

sample_app/views.py

我们可以观察到,StudentSerializer(result, many=True) 以 JSON 格式返回了序列化数据,是一个对象列表。或者,我们可以通过 URL 传递 id 参数 - http://127.0.0.1:8000/api/basic/1/。在这里我们传递 1 作为 id,为了处理请求,我们需要修改 urls.py。我们添加路径如下。

sample_app/urls.py

当我们访问 http://127.0.0.1:8000/api/basic/1/ 时,它将显示以下结果。

我们只得到一个 JSON 响应,而不是对象列表。

更新值——Patch 请求处理程序

到目前为止,我们已经实现了获取和添加记录的功能。现在,我们将创建用于更新数据库中已存在记录的端点。我们可以使用针对特定 id 的 POST 请求来更新记录。然后我们检索对象,更新其值并将其保存到相同的 id 下,从而保留更改。

APIView 类提供了 patch() 方法,用于处理 PATCH 请求并更新数据。

让我们按如下方式更新 views.py 文件。

我们想强调的行

serializer = StudentSerializer(result, data = request.data, partial=True)

让我们理解上面这行代码

  • 获取要更新的给定 id 记录。
  • 传递给 StudentSerializer 转换为 JSON。
  • 从请求中接收到的数据。
  • partial=True 表示这可能不包含我们 Student 模型的所有字段。

我们需要传递实际的实例,我们将不得不使用 get() 函数首先检索资源然后更新它。现在,我们将向 http://127.0.0.1:8000/api/basic/1/ 发送补丁请求,并更新我们的项目。

我们将 last_name "Sharma" 改为 "Yadav"。

响应显示更新后的 last_name。我们可以通过访问 http://127.0.0.1:8000/api/basic/1/update 端点进行验证。

在这里,我们可以看到我们的数据已成功更新。

删除实体 - DELETE 请求处理程序

用户还希望从数据库中删除一些条目。为此,APIView 类提供了 delete() 方法,该方法根据给定的 ID 删除记录。我们不需要为此目的使用序列化器,因为数据和具体对象之间没有转换。在这里,我们不使用 Students.objects.get(),而是可以使用 get_object_or_404() 函数,如果给定 ID 不存在,它将自动返回 404 错误。

让我们理解 delete() 方法的以下实现。

sample_app/views.py

当我们重启服务器时,它会在 API 浏览器上显示 DELETE 按钮。当我们点击 DELETE 按钮时,它会从数据库中删除该特定 ID 的记录。

Create REST API using Django REST Framework | Django REST Framework Tutorial

删除 http://127.0.0.1:8000/api/basic/1/ 的记录后,将显示以下响应。

当我们访问 http://127.0.0.1:8000/api/basic/ 时,该记录已不存在。

我们已经使用 DRF 实现了 CRUD API。

CRUD API 完整代码

以下是我们在本教程中实现的 CRUD 操作的完整代码。

sample_app/urls.py

结论

本教程详细介绍了 DRF 以及如何在 Django 中构建 RESTful API。在本教程中,我们创建了一个项目并添加了一个 sample_app 应用程序。我们创建了 Student 模型和 StudentSerializer 来处理我们模型的序列化和反序列化。这是一个 CRUD API,其中我们有重要的请求处理程序 get()、post()、patch() 和 delete()。通过从中获取灵感,您可以出于练习目的为购物网站创建 CRUD API。