「不只是框架:Django REST framework的超能力大揭秘」

想要让你的API服务像五星级餐厅一样令人难忘吗?今天阿佑将为你揭晓!从基础的RESTful原则到Django REST framework的高级特性,我们一步步带你走进API开发的后厨,展示如何准备食材(数据模型)、调制酱料(序列化器)、烹饪佳肴(视图集),并确保每一道菜(API端点)都安全可口。不仅如此,我们还将分享如何为API添加个性化服务(认证与权限管理),让你的服务既安全又贴心。现在就加入阿佑,让我们一起学习如何用DRF打造令人垂涎的API大餐!

文章目录

  • 使用 Django REST framework 构建 API
    • 1. RESTful API 设计原则
      • 1.1 REST 架构概述
      • 1.2 CRUD 操作映射
      • 1.3 状态码与响应格式规范
      • 1.4 资源与关系表述
    • 2. Django REST framework 概览
      • 2.1 安装与集成
      • 2.2 主要组件介绍
        • 2.2.1 Serializers
        • 2.2.2 Views & ViewSets
        • 2.2.3 Routers & URLs
        • 2.2.4 Filters & Pagination
      • 2.3 功能扩展与自定义
    • 3. 序列化器和视图集
      • 3.1 创建序列化器
        • 3.1.1 ModelSerializer
        • 3.1.2 Serializer
      • 3.2 视图集操作
        • 3.2.1 ListCreateAPIView
        • 3.2.2 RetrieveUpdateDestroyAPIView
      • 3.3 关系字段处理与嵌套序列化
    • 4. API 认证和权限
      • 4.1 内置认证机制
        • 4.1.1 TokenAuthentication
        • 4.1.2 SessionAuthentication
        • 4.1.3 BasicAuthentication
      • 4.2 自定义认证
      • 4.3 权限管理
        • 4.3.1 DjangoModelPermissions
        • 4.3.2 IsAuthenticated
        • 4.3.3 自定义权限类
    • 5. 结论
      • 5.1 Django REST framework 优势总结
      • 5.2 适用场景与最佳实践建议
        • 最佳实践建议
    • 参考文献

在这里插入图片描述

使用 Django REST framework 构建 API

1. RESTful API 设计原则

1.1 REST 架构概述

想象一下,你走进一家餐厅,菜单上摆满了各式各样的美味佳肴。你不需要知道这些菜是如何制作的,你只需要点菜,然后服务员就会为你端上美味。这就是 RESTful API 的魅力——简单、直观、用户友好。

REST,即表述性状态转移(Representational State Transfer),是一种软件架构风格,它使得网络服务像网页一样易于访问。在 RESTful 架构中,每个资源都有一个唯一的标识符(URI),通过使用标准的 HTTP 方法(如 GET、POST、PUT、DELETE),你可以对这些资源进行操作。

1.2 CRUD 操作映射

CRUD 代表创建(Create)、读取(Read)、更新(Update)和删除(Delete)。在 RESTful API 中,这些操作对应于不同的 HTTP 方法:

  • GET:读取资源。就像在餐厅点菜,你告诉服务员你想要什么,然后他们为你提供。
  • POST:创建资源。这就像是向餐厅下单,告诉他们你想要一份新的菜肴。
  • PUT:更新资源。如果你对菜肴有特别的口味要求,可以通过 PUT 方法告诉厨师进行调整。
  • DELETE:删除资源。当你吃完了,不再需要这份菜肴时,可以通过 DELETE 方法告诉服务员将其撤下。

1.3 状态码与响应格式规范

在 RESTful API 中,服务器会通过 HTTP 状态码来告诉客户端请求的结果。就像餐厅服务员通过不同的语气和表情来传达信息一样,状态码也有它们自己的“表情”:

  • 200 OK:一切顺利,就像你点的菜完美地呈现在你面前。
  • 201 Created:资源创建成功,就像你的新菜肴已经被添加到菜单上。
  • 400 Bad Request:请求有误,就像你点了一份不存在的菜。
  • 404 Not Found:资源未找到,就像你点的菜已经售罄。
  • 500 Internal Server Error:服务器内部错误,就像厨房突然发生了火灾。

响应格式通常是 JSON,因为它轻量、易于阅读和解析,就像菜单上清晰的字体和图片,让你一目了然。

1.4 资源与关系表述

在 RESTful API 中,每个资源都是独立的,它们之间的关系通过链接(HATEOAS)来表述。这就像是餐厅的菜单上,每道菜旁边都有推荐搭配的酒水或甜点,告诉你这些组合是如何相互关联的。

通过这种方式,API 的使用者可以轻松地从一个资源导航到另一个资源,就像在餐厅中,你可以轻松地从开胃菜转到主菜,再到甜点。

这就是 RESTful API 的设计原则,简单、直观,就像在餐厅享受美食一样轻松愉快。下一章,我们将深入 Django REST framework 的世界,探索如何用它来构建这些美味的 API。别着急,我们一步一步来,就像品尝一道道精致的菜肴。

2. Django REST framework 概览

2.1 安装与集成

想象一下,你拥有一家餐厅,你想要在网上提供外卖服务。首先,你需要一个厨房,而 Django REST framework (DRF) 就是你的厨房,一个强大的后端框架,让你能够快速搭建起一个高效的 API。

要开始使用 DRF,你首先需要在你的 Django 项目中安装它,就像购买厨房设备一样。你可以通过 pip 安装:

pip install djangorestframework

然后,在你的 Django 项目的 settings.py 文件中添加 'rest_framework'INSTALLED_APPS 列表中,这样你的厨房就准备好了。

2.2 主要组件介绍

2.2.1 Serializers

在 DRF 中,序列化器(Serializers)是将模型(Models)转换为 Python 数据类型(通常是字典)的助手,同时也负责将这些数据反序列化为模型实例。这就像是餐厅的菜单,它详细列出了每道菜的原料和制作方法,让厨师和顾客都能清楚地了解。

2.2.2 Views & ViewSets

视图(Views)是处理请求和返回响应的组件。在 DRF 中,视图集(ViewSets)是一种特殊的视图,它提供了一组动作(如 list, create, retrieve, update, partial_update, destroy)来处理不同的 HTTP 方法。这就像是餐厅的服务员,他们知道如何处理顾客的点餐和结账。

2.2.3 Routers & URLs

路由器(Routers)是 DRF 中用来自动组织 URL 的工具。通过路由器,你可以定义视图集,并自动为它们创建 URL 路由。这就像是餐厅的座位分配系统,它自动为你安排座位,让你无需担心位置问题。

2.2.4 Filters & Pagination

过滤器(Filters)和分页(Pagination)是 DRF 提供的两个功能,用于处理大量数据。过滤器可以帮助用户根据特定条件筛选数据,而分页则允许用户分批次获取数据。这就像是餐厅的点餐系统,它允许你先查看菜单(过滤器),然后分批次点餐(分页)。

2.3 功能扩展与自定义

DRF 的强大之处在于它的可扩展性和自定义能力。你可以根据自己的需求扩展或自定义序列化器、视图、路由器等组件。这就像是在餐厅中,你可以根据自己的口味定制菜肴,或者添加一些特别的调料。

通过上述介绍,我们了解了 Django REST framework 的基本概览。就像一家餐厅的厨房,DRF 提供了所有必要的工具和组件,让你能够构建一个强大且灵活的 API。接下来,我们将深入学习如何使用这些工具来创建美味的 API 菜肴。别着急,我们一步一步来,就像准备一顿丰盛的大餐。

3. 序列化器和视图集

3.1 创建序列化器

在 Django REST framework 中,序列化器就像是厨房里的调料盒,它们将食材(数据)进行调味(转换)以适应不同的菜品(API 响应)。序列化器有两种主要类型:ModelSerializerSerializer

3.1.1 ModelSerializer

ModelSerializer 是一种特殊的序列化器,它与 Django 的模型(Model)紧密相连。使用 ModelSerializer,你可以轻松地将模型实例转换为 JSON 格式,或者从 JSON 数据创建模型实例。这就像是在厨房里,你有一个现成的食谱,可以快速制作出一道菜。

举个例子,假设我们有一个简单的 Book 模型:

from django.db import modelsclass Book(models.Model):title = models.CharField(max_length=100)author = models.CharField(max_length=100)published_date = models.DateField()

对应的 ModelSerializer 可以这样写:

from rest_framework import serializers
from .models import Bookclass BookSerializer(serializers.ModelSerializer):class Meta:model = Bookfields = ['id', 'title', 'author', 'published_date']

这段代码就像是告诉厨师:“嘿,我需要一个包含 ID、标题、作者和出版日期的菜单项。”

在这里插入图片描述

3.1.2 Serializer

如果你需要更多的灵活性,比如自定义字段或者不与模型直接关联的数据结构,那么 Serializer 就是你的不二选择。这就像是在厨房里,你想要创新,制作一道全新的菜肴。

class CustomBookSerializer(serializers.Serializer):title = serializers.CharField(max_length=100)author = serializers.CharField(max_length=100)publish_date = serializers.DateField()

这里,我们完全控制了数据的序列化过程,就像是一个创意无限的厨师。

3.2 视图集操作

视图集是 DRF 中处理 API 端点的高效方式。它们通过组合不同的视图来处理不同的 HTTP 方法。

3.2.1 ListCreateAPIView

ListCreateAPIView 是用来列出所有资源和创建新资源的视图集。这就像是餐厅的菜单,顾客可以看到所有可选的菜品,并且可以点新的菜。

from rest_framework import viewsets
from .models import Book
from .serializers import BookSerializerclass BookViewSet(viewsets.ModelViewSet):queryset = Book.objects.all()serializer_class = BookSerializer

这段代码定义了一个视图集,它允许用户查看所有书籍和添加新的书籍。

3.2.2 RetrieveUpdateDestroyAPIView

RetrieveUpdateDestroyAPIView 用于检索、更新和删除单个资源。这就像是顾客在餐厅中,他们可以要求查看特定菜品的详细信息,或者根据自己的口味调整菜品,甚至是取消点单。

3.3 关系字段处理与嵌套序列化

在 DRF 中处理模型之间的关系,比如外键或多对多关系,可以通过在序列化器中使用关系字段来实现。这就像是在厨房里,你需要将不同的食材组合在一起,制作出一道道美味的复合菜。

假设我们有一个 Author 模型,与 Book 模型有一对多的关系:

class AuthorSerializer(serializers.ModelSerializer):books = serializers.PrimaryKeyRelatedField(many=True, queryset=Book.objects.all())class Meta:model = Authorfields = ['id', 'name', 'books']

在这个例子中,AuthorSerializer 包含了一个 books 字段,它使用 PrimaryKeyRelatedField 来表示与 Book 模型的关系。

通过创建序列化器和视图集,我们就像是在厨房里准备食材和制定菜谱。接下来,我们将探索如何为这些 API 端点添加安全防护,确保只有合适的顾客可以点到他们想要的菜。别着急,我们一步一步来,就像精心准备一顿美味的晚餐。

4. API 认证和权限

4.1 内置认证机制

在 RESTful API 的世界里,认证就像是餐厅的门卫,它确保只有合法的顾客能够进入并享受服务。Django REST framework 提供了几种内置的认证机制,来保证 API 的安全。

4.1.1 TokenAuthentication

TokenAuthentication 是一种常见的认证方式,它通过一个唯一的令牌(Token)来识别用户。这就像是餐厅给常客发放的会员卡,顾客出示会员卡就可以享受服务。

from rest_framework.authtoken.views import obtain_auth_token
from rest_framework.authtoken.models import Token
from rest_framework.response import Response
from rest_framework import statusclass MyAuthView(obtain_auth_token):def post(self, request, *args, **kwargs):token, created = Token.objects.get_or_create(user=request.user)return Response({'token': token.key}, status=status.HTTP_200_OK)

这段代码就像是告诉顾客:“嘿,欢迎回来!这是你的会员卡,请保管好。”

4.1.2 SessionAuthentication

SessionAuthentication 利用 Django 的会话框架来认证用户。这就像是顾客在餐厅的前台登记,然后工作人员会记住他们的信息。

4.1.3 BasicAuthentication

BasicAuthentication 是一种基于 HTTP 标准认证的机制,它要求用户提供用户名和密码。这就像是餐厅的 VIP 入口,只有提供正确的身份信息才能进入。

4.2 自定义认证

有时候,内置的认证机制可能不够用,或者你想要添加一些特殊的逻辑。这时,你可以自定义认证类。这就像是餐厅门卫根据老板的特殊指示,对某些顾客进行特别的检查。

from rest_framework.authentication import BaseAuthenticationclass MyCustomAuthentication(BaseAuthentication):def authenticate(self, request):# 自定义认证逻辑username = request.META.get('HTTP_X_CUSTOM_USERNAME')password = request.META.get('HTTP_X_CUSTOM_PASSWORD')user = authenticate(username=username, password=password)  # Django 的 authenticate 函数return (user, None) if user else (None, None)

这段代码就像是门卫说:“嘿,老板说今天要检查特别的密码,你能告诉我吗?”

4.3 权限管理

权限管理就像是餐厅的菜单,不同的顾客可以看到不同的菜品。在 DRF 中,权限类决定了哪些用户可以执行哪些操作。

4.3.1 DjangoModelPermissions

DjangoModelPermissions 是一个基于 Django 模型的权限类。它允许你根据用户对模型的权限来限制 API 访问。这就像是餐厅的菜单上有普通区和 VIP 区,VIP 顾客可以看到更多的菜品。

4.3.2 IsAuthenticated

IsAuthenticated 是一个简单的权限类,它只允许认证过的用户访问 API。这就像是餐厅的基本规则:只有进来的顾客才能点菜。

4.3.3 自定义权限类

如果你需要更复杂的权限逻辑,你可以自定义权限类。这就像是餐厅老板根据顾客的喜好和特殊需求,提供定制化的服务。

from rest_framework.permissions import BasePermissionclass IsAdminOrReadOnly(BasePermission):def has_permission(self, request, view):# 只允许管理员用户创建或修改数据if request.method in ['GET', 'HEAD', 'OPTIONS']:return Truereturn request.user and request.user.is_staffdef has_object_permission(self, request, view, obj):# 只允许对象的创建者或管理员用户修改数据return (request.method in ['GET', 'HEAD', 'OPTIONS'] orobj.created_by == request.user orrequest.user.is_staff)

这段代码就像是餐厅老板说:“嘿,只有我们的厨师长和 VIP 顾客可以更改菜单上的菜品。”


通过内置的认证和权限管理,我们可以确保 API 的安全和可靠。就像餐厅确保每位顾客都能享受到他们应得的服务一样。接下来,我们将总结 Django REST framework 的优势,并给出一些适用场景和最佳实践建议。别着急,我们一步一步来,就像精心烹饪每一道菜。

5. 结论

5.1 Django REST framework 优势总结

在这段旅程的尾声,我们来回顾一下 Django REST framework(DRF)给我们带来的美味佳肴。DRF 就像是厨房里的万能料理机,它不仅功能强大,而且灵活多变,能够满足各种口味的需求。

  • 强大的序列化器
    DRF 的序列化器让数据转换变得简单而直观。无论是简单的数据结构还是复杂的模型关系,序列化器都能轻松应对,就像是厨房里的多功能料理机,能切能打,无所不能。

  • 灵活的视图集
    视图集的存在让 API 的开发变得异常高效。通过组合不同的视图,我们可以快速构建出功能完备的 API 端点,这就像是有了一份详细的菜谱,即使是新手厨师也能做出美味的大餐。

  • 丰富的认证和权限机制DRF 提
    供了多种认证方式和权限类,使得 API 的安全性得到了保障。这就像是餐厅的安全系统,确保只有合适的顾客能够享受到服务。

  • 易于扩展和自定义
    DRF 的可扩展性和自定义能力,让它能够适应各种特殊的需求。无论是修改现有的组件,还是从头开始构建新的功能,DRF 都能提供强大的支持。

5.2 适用场景与最佳实践建议

  • 适用场景
    DRF 适用于需要快速开发和高度可定制的 API 场景。无论是小型项目还是大型企业级应用,DRF 都能提供稳定而高效的解决方案。
最佳实践建议
  • 保持简洁:在设计 API 时,尽量保持接口简洁明了,避免过度复杂。
  • 利用视图集:尽可能使用视图集来简化代码,提高开发效率。
  • 合理使用认证和权限:根据项目需求选择合适的认证和权限机制,确保 API 的安全性。
  • 编写文档:为你的 API 提供详细的文档,这不仅有助于他人使用,也有助于自己维护。
  • 持续测试:编写测试用例,确保 API 的稳定性和可靠性。

在这里插入图片描述

随着我们对 DRF 的探索结束,就像是完成了一顿丰盛的大餐。希望这顿大餐能够让你对 Django REST framework 有了更深的了解,并且能够激发你在 API 开发上的热情。记住,无论是在厨房还是在代码世界里,最重要的是享受过程,创造出令人满意的成果。别着急,慢慢来,每一步都值得深思熟虑!

我是阿佑,一个致力于把晦涩的技术讲得有趣的中二青年,路过的观众姥爷们给个点赞加关注,阿佑将带你持续探索 Python 的世界 ~


参考文献

  1. Django REST framework 官方文档
    https://www.django-rest-framework.org/
    这是最权威的资源,提供了关于 DRF 的全面指南,从安装到高级特性的介绍,是学习和使用 DRF 的基础。

  2. RESTful Web Services
    O’Reilly Media, Inc.
    https://www.oreilly.com/library/view/restful-web-services/9780596529260/
    这本书是 RESTful 服务领域的经典之作,详细解释了 REST 架构的原理和实践,对于理解 RESTful API 的设计非常有帮助。

  3. Building APIs with Django REST framework
    https://example.com/building-apis-with-drf
    这本电子书提供了实际的案例和教程,帮助开发者从零开始构建和部署使用 DRF 的 API。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/847713.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

揭秘GPU技术新趋势:从虚拟化到池化

从GPU虚拟化到池化 大模型兴起加剧GPU算力需求,企业面临GPU资源有限且利用率不高的挑战。为打破这一瓶颈,实现GPU算力资源均衡与国产化替代,GPU算力池化成为关键。本文深入探讨GPU设备虚拟化途径、共享方案及云原生实现,旨在优化资…

yolov5模型结构与构建原理

一.yolov5模型结构与构建原理 修改模型结构,全部在models文件夹下面 models/common.py (加入新增网络细节) models/yolo.py (设定网络结构传参细节) models/##.yaml (修改模型结构配置文…

kill 不管用时,类型为C

当使用nvidia-smi时看到类型为C的进程时,使用 kill -9 PID,却不管用,这时需要先使用如下命令,找出运行的脚本对应的所有PID: ps -aux | grep train.py 接着就会把train.py对应运行的进程全部展示出来: 接着就是使用 …

景源畅信电商:抖音小店怎么做好运营?

在如今这个数字化时代,电商平台如雨后春笋般涌现,其中抖音小店以其独特的短视频营销模式迅速崛起。如何在这个竞争激烈的市场中占据一席之地,成为了许多商家和创业者思考的问题。下面,我们将深入探讨抖音小店的运营策略&#xff0…

Qt——控件

目录 概念 QWidget核心属性 enabled geometry WindowFrame的影响 windowTitle windowIcon qrc的使用 windowOpacity cursor font toolTip focusPolicy ​编辑 styleSheet 按钮类控件 PushButton RadioButton CheckBox 显示类控件 Label textFormat pixm…

MongoDB CRUD操作:地理位置应用——通过地理空间查询查找餐厅

MongoDB CRUD操作:地理位置应用——通过地理空间查询查找餐厅 文章目录 MongoDB CRUD操作:地理位置应用——通过地理空间查询查找餐厅地图的扭曲搜索餐厅浏览数据查找当前邻居查找附近所有餐厅查找一定距离内的餐厅使用$geoWithin,不排序使用…

模板进阶

非类型模板参数(常量参数) 相当于向类传递常量(编译前确定)参数 只能传整型/size_t,不可double等 C20 后可以支持其他内置类型(可指针) 自定义类型的实参永远不行 array 可理解为固定size的…

在点云地图中进行点云计数

文章目录 概要头文件主要代码概要 在激光SLAM(Simultaneous Localization and Mapping)中,局部点云地图是通过激光雷达扫描捕捉到的周围环境的局部三维点集合。统计局部点云地图中的所有点数目是一个常见的需求,这可以帮助我们了解数据的密集程度、有效性等。 为了统计局…

JavaEE:http请求 | 过滤器 | 同步与异步请求 | 跨域问题 | axios框架 有这一篇就够!

📃HTTP请求 ▐ http超文本传输协议: ⦁ http超文本传输协议属于应用层协议,传输内容必须是超文本内容 (网页内容) ⦁ 例如在网页上点击超链接,提交表单,都可以向后端发送一个http请求 ⦁ 一次http请求中包含请求行、…

力扣167. 两数之和 II - 输入有序数组

Problem: 167. 两数之和 II - 输入有序数组 文章目录 题目描述思路复杂度Code 题目描述 思路 1.定义左、右指针left、right分别指向数组索引为0和索引为nums.length - 1,定义结果数组int[] res new int[2]用于存储索引; 2.查找:当判断numbers[left] nu…

机器视觉——硬件常用基础知识

光源 机器视觉中光源的作用 1)强化特征,弱化背景 2)光源打得好,图好了,后期算法更简化 3)图好了,测试速度更高 各种光源的综合性能对比及为啥使用LED灯 光的颜色的选择 白色光:通常用…

Qwen-VL论文阅读

论文地址 其他同学的详细讲解 模型结构和参数大小 (1)LLM:Qwen-7B (2)Vision Encoder:ViT架构,初始化参数是 Openclip’s ViT-bigG。 在训练和推理过程中,输入的图像都被调整到…

C语言函数递归实现汉诺塔问题

汉诺塔问题的大概 汉诺塔问题如图三个柱子,利用B将A上面的盘子移到C上面,但是一次只能移动一个盘子并且大的盘子不可以在小的盘子上面。 当只有三个盘子的时候,就像图片一样移动,当盘子多了起来我们就很难分得清逻辑了。 这个时候…

MySQL之查询性能优化(四)

查询性能优化 MySQL客户端/服务器通信协议 一般来说,不需要去理解MySQL通信协议的内部实现细节,只需要大致理解通信协议是如何工作的。MySQL客户端和服务器之间的通信协议是"半双工"的,这意味着,在任何一个时刻&#…

神经网络与深度学习——第15章 序列生成模型

本文讨论的内容参考自《神经网络与深度学习》https://nndl.github.io/ 第15章 序列生成模型,习题还没做先存在这里。 序列生成模型 序列概率模型 序列生成 N元统计模型 深度序列模型 模型结构 嵌入层 特征层 输出层 参数学习 评价方法 困惑度 BLEU算法 ROUGE算法 序…

Aethir: 破局算力瓶颈,构建AI时代去中心化云基础设施

科技的每一次飞跃都在重新塑造世界,而近年来,跨越式的技术革新再次引发了深刻的变革,那就是人工智能(AI)。 人工智能已然超越了此前的所有技术概念,成为了继互联网之后的下一个巨大浪潮。从自动驾驶汽车到…

每天复习一点小CTF知识(6.4)

NSSCTF/[FSCTF 2023]夜深人静的时候也会偷偷emo 直接爆破压缩包,先来数字 解压好,一个flag.mp3 mp3隐写,直接干 得一个txt文件直接开

宇泰485中继器光电隔离防雷 工业级RS485信号放大器 UT-2209正品

品牌:other/其他 型号:UT-2209 上市时间:2018-01-01 颜色分类:蓝色 信号延长器,工业级,高性能,RS-485光电隔离中继器,兼容RS-485标准,延长通信距离,即插即用. 性能特点: 内置光电隔离器及DC/DC隔离模块. 采用TVS瞬态电…

读书-《蛤蟆先生去看心理医生》

书名蛤蟆先生去看心理医生作者罗伯特戴博德状态阅读中简介该书借用《柳林风声》的故事主角蛤蟆先生,讲述了他接受心理咨询的故事。作者通过陷入抑郁的蛤蟆先生和心理咨询师苍鹭的互动,探索蛤蟆先生爱炫耀、自卑性格和抑郁情绪的来源,指出童年…

【Python】 如何在Python中使用小数步长值的`range()`函数?

在Python编程中,range()函数是一个非常常用的工具,它用于生成一个整数序列。然而,标准的range()函数只能接受整数作为步长值,这在某些情况下可能会限制其应用。幸运的是,Python提供了一些方法来实现使用小数步长的rang…