使用 Django REST framework 创建 RESTful API

阅读时长 11 分钟读完

在现代开发中,RESTful API 已经成为了构建分布式系统的标准方式。Django REST framework 是 Django 的一个强大的扩展,提供了方便易用的工具来快速创建高质量的 RESTful API。

本文将介绍如何使用 Django REST framework 创建 RESTful API,包含以下内容:

  • 什么是 RESTful API
  • Django REST framework 的优势和常用组件
  • 如何搭建 Django REST framework 项目
  • 如何创建模型和序列化器
  • 如何使用视图集和路由
  • 如何进行身份验证和权限控制

RESTful API 概述

RESTful API 是一种基于 HTTP 协议,按照一定的约定去设计和组织 API 接口,以提供资源的表现形式,并通过 URI 去访问这些资源。RESTful API 通常使用 JSON 格式进行数据传输,而不是 XML 或 SOAP。它的设计原则包括:

  • 每个资源对应一个 URI(Uniform Resource Identifier),即通过 URL 去访问它
  • 通过 HTTP Method(GET、POST、PUT、DELETE 等)去操作资源
  • 使用标准 HTTP 状态码返回结果
  • 返回的数据格式通常是 JSON,同时也支持 XML 和其他格式

Django REST framework 的优势和常用组件

Django REST framework 是 Django 的一个扩展,它为 Django 应用提供了一套方便的工具来构建和管理 RESTful API,具有以下优势:

  • 易于学习和理解,具有简单但强大的 API 设计
  • 灵活多变,支持多种数据格式、身份验证方式和权限控制
  • 提供了丰富的默认组件,如模型序列化器、视图集、路由等
  • 可以灵活地自定义组件,以满足特定的业务需求
  • 社区活跃,有强大的文档和示例代码支持

Django REST framework 的常用组件包括:

  • 版本控制组件:可以对 API 的版本进行管理
  • 请求解析器组件:可以解析请求的格式,如 JSON、Form、MultiPart 等
  • 序列化器组件:可以将模型数据转换为 JSON、XML 等格式
  • 视图组件:提供了多种视图方式,如类视图、函数视图等
  • 路由组件:可以动态管理 API 的 URL,方便扩展和重构
  • 身份验证组件:可以对用户进行身份验证,如基于 Token 的身份验证
  • 权限控制组件:可以精细地控制用户的权限,比如只允许管理员进行操作

搭建 Django REST Framework 项目

在开始之前,请确保你已经安装了 Django 和 Django REST framework,可以通过以下命令进行安装:

接下来,我们可以使用如下命令创建一个 Django 项目:

然后创建一个 Django 应用:

在 settings.py 文件中添加配置:

-- -------------------- ---- -------
-------------- - -
    -----------------------
    ----------------------
    ------------------------------
    --------------------------
    --------------------------
    -----------------------------
    -----------------   - ----
    --------            - ----
-
展开代码

在 urls.py 文件中添加路由配置:

创建模型和序列化器

在创建 RESTful API 之前,我们需要先定义数据模型和序列化器。模型定义了数据的结构,序列化器则负责将模型数据转换为 JSON 格式。

下面是一个简单的模型定义,用于保存博客文章的信息:

我们可以使用 Django REST framework 的 ModelSerializer 类来定义一个序列化器:

使用视图集和路由

在 Django REST framework 中,视图集(Viewset)是一种特殊的视图,用于处理 RESTful API 中的 CRUD(Create、Read、Update、Delete)操作,可以统一管理相同资源的多种操作。例如,在上面的例子中,我们希望创建一个资源管理器,对文章进行增删改查操作,可以使用如下代码:

这里我们定义了一个名为 PostViewSet 的视图集,它继承自 viewsets.ModelViewSet 类,并指定了模型和序列化器。

然后我们需要定义一个路由,将 URL 映射到视图集上:

-- -------------------- ---- -------
---- ----------- ------ ----- -------
---- ---------------------- ------ -------------
---- ----------- ------ -----------

------ - ---------------
------------------------ ------------

----------- - -
    -------- ----------------------
-
展开代码

这里我们使用了 Django REST framework 的 DefaultRouter 类,自动生成了访问文章资源的路由。要点解这个 register 方法中的第一个参数是 ‘posts’,这个字符串指定了 URL 的前缀,即访问文章资源时需要在 URL 中添加此前缀。router.urls 会自动生成 URL 集合,我们直接使用 include 函数将其包含在 urlpatterns 中即可。

身份验证和权限控制

在实际项目中,我们可能需要对用户进行身份验证和权限控制,以确保 API 的安全性。

Django REST framework 为身份验证和权限控制提供了许多默认的组件,我们可以使用这些组件来增强 API 的安全性。

以下是一个示例,使用基于 Token 的身份验证和基于角色的权限控制:

-- -------------------- ---- -------
---- ----------------------------- ------ -------------------
---- -------------------------- ------ ---------------- -----------
---- ------------------------- ------ ------

----- -----------------------------------
    -------- - ------------------
    ---------------- - --------------
    ---------------------- - ----------------------   - ----
    ------------------ - ----------------- ------------  - ----
    
    --------------------- ---------------- --------------------
    --- -------------- ---------
        ----- - ----------------------------------------
        ---------- - -------------------------- ----------
        ------ -------------------------
展开代码

在上面的代码中,我们使用了 authentication_classes 和 permission_classes 来指定身份验证方式和权限控制。在这个例子中,我们使用了基于 Token 的身份验证,并使用了 IsAuthenticated 和 IsAdminUser 来控制只有管理员才能进行操作。

我们还定义了一个 action,用于获取当前用户的文章列表。首先我们过滤出当前用户的文章,然后将其传入序列化器,最后返回 JSON 格式的数据。

结语

通过本文的学习,你应该已经掌握了使用 Django REST framework 创建 RESTful API 的基本流程和技术要点。你可以进一步深入学习 Django REST framework 的其他组件,以满足实际项目的需求。

示例代码:

models.py

-- -------------------- ---- -------
---- --------- ------ ------

----- -------------------
    ----- - --------------------------------
    ------- - ------------------
    ------ - ------------------------------ --------------------- -------------------------
    ---------- - ---------------------------------------
    ---------- - -----------------------------------

    --- --------------
        ------ ----------
展开代码

serializers.py

views.py

-- -------------------- ---- -------
---- -------------- ------ --------- -----------
---- ------------------------- ------ ------
---- ----------------------- ------ --------
---- ------------ ------ ----
---- ----------------- ------ --------------

----- -----------------------------------
    -------- - ------------------
    ---------------- - --------------
    ------------------ - --------------------------------------- -

    --- -------------------- ------------
        -----------------------------------------

    --------------------- ---------------- --------------------
    --- -------------- ---------
        ----- - ----------------------------------------
        ---------- - -------------------------- ----------
        ------ -------------------------
展开代码

urls.py

-- -------------------- ---- -------
---- ----------- ------ ----- -------
---- ---------------------- ------ -------------
---- ----------- ------ -----------


------ - ---------------
------------------------ ------------

----------- - -
    -------- ----------------------
-
展开代码

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6791ffc7504e4ea9bd5d32a2

纠错
反馈

纠错反馈