使用Django Rest Framework构建API

news2024/11/14 13:31:20

        Django Rest Framework (DRF) 是一个强大且灵活的工具集,用以构建Web API。它基于Django,一个非常流行的Python Web框架。在本文中,我们将深入探讨如何使用DRF来构建一个高效、结构化的API。


目录

使用Django Rest Framework构建API

一、环境设置和项目创建

1. Python和Django的安装

2. Django和DRF的安装

3. 创建新的Django项目

4. 添加应用

5. 虚拟环境与依赖管理

二、序列化数据

1. 理解序列化和反序列化

2. 创建序列化器

3. 序列化器的高级用法

三、视图和路由

1. 创建API视图

2. 配置路由

3. 高级路由配置

四、安全性和权限

1. 全局设置认证和权限

2. 细节级别安全设置

五、测试和文档

1. 单元测试

2. 集成测试和验收测试

3. 文档生成

六、总结


使用Django Rest Framework构建API

 

一、环境设置和项目创建

        在开始之前,确保您已经安装了Python和Django的环境。Python和Django是开发任何Django项目的基石,因此,确认安装是初步且关键的步骤。安装Python通常是直接的,但确保您正在使用支持的版本(至少是Python 3.6及以上版本)。

1. Python和Django的安装

  • 下载并安装Python: 访问Python官方网站,下载适合您操作系统的Python版本,并执行安装程序。(Welcome to Python.org)
  • 设置Python环境变量: 确保Python可执行文件的路径被添加到系统的环境变量中,这使得您可以在命令行中全局访问Python命令。
  • 验证Python安装: 在命令行中输入pythonpython3,您应该看到Python的交互式 shell。

2. Django和DRF的安装

  • 安装Django: Django可以通过Python的包管理工具pip进行安装。在命令行中运行pip install django应该足够安装Django框架。
  • pip install djangorestframework
    
  • 检查Django安装: 通过创建一个新的Django项目来测试安装是否成功。在命令行中输入django-admin startproject testproject,然后进入该项目目录,运行python manage.py runserver。如果在浏览器中访问http://localhost:8000能看到默认的Django欢迎页面,则表明Django已正确安装。
  • 安装Django Rest Framework: 同样使用pip工具,执行pip install djangorestframework。这将安装所有必要的包以运行DRF。
  • 简单验证DRF安装: 为了验证DRF也已正确安装,可以尝试在项目中创建一个简单的路由来查看是否能够正常运行。

3. 创建新的Django项目

  • 使用django-admin工具: django-admin是Django自带的命令行工具,可以方便地创建和管理Django项目。
  • 设定项目名称和目录: 在创建项目时,您应该思考合适的项目名,这将是您的顶级应用名称。
  • 项目结构: Django创建的项目会有基本的目录结构,包括根目录下的manage.py, 核心配置在settings.py以及应用特定的设置在urls.py
  • django-admin startproject myproject
    

4. 添加应用

  • 理解Django的应用模型: 在Django中,每个功能模块通常由一个应用表示。每个应用都有自己的模型、视图、模板等。
  • 创建API应用: 对于本教程,我们创建一个叫做api的新应用,它将承载我们的Web API。
  • 组织代码: 合理组织您的代码将有助于后续维护和扩展。考虑将模型、视图和路由分成不同的文件,以便管理。

5. 虚拟环境与依赖管理

  • 使用虚拟环境: 强烈建议使用虚拟环境包裹您的项目依赖,避免不同项目间的依赖混乱。
  • pipenv或virtualenv: 选择其中之一作为您的虚拟环境管理器。两者都可以有效地创建隔离的Python环境。
  • requirements.txt: 随着项目的进展,您会添加更多的包。使用pip freeze > requirements.txt来保存您的包及其版本到一个文件中。这有助于项目的部署和团队协作。

二、序列化数据

        在Django Rest Framework中,序列化数据是核心概念之一。序列化器是DRF中一个强大的工具,它转换复杂的数据类型为易于Web API消费的格式,如JSON。反之,它也处理从请求数据中解析用户发送的数据到Python对象的过程。这个双向的数据处理机制使得数据库内容可以容易地被任何客户端使用。

1. 理解序列化和反序列化

  • 序列化: 是将模型实例转换为可以被存储或传输的格式(通常是JSON,XML等)的过程。这对于API响应非常有用,因为它允许服务器发送可以被多种类型的客户端轻松解析的标准化数据。
  • 反序列化: 是将已存储或传输的格式转换回模型实例的过程。当API接收数据时经常用到,比如在创建或更新数据库记录时。

2. 创建序列化器

        DRF通过serializers.py文件来管理序列化器。在这个文件中,您可以定义如何将模型转换为可序列化的格式,以及反之。

from rest_framework import serializers
from .models import YourModel

class YourModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = YourModel
        fields = ['field1', 'field2']
  • 定义模型序列化器: 每个模型通常都有一个相应的序列化器类。例如,对于YourModel,您会创建一个YourModelSerializer
  • 字段覆盖和自定义: 您可以在序列化器中添加、删除或修改模型的字段。这包括指定字段类型、验证方法以及如何从数据库表示转换到序列化表示。
  • 嵌套和复杂的数据关系: DRF支持复杂的数据关系,如多表关系和反向关系。您可以使用StringRelatedFieldSlugRelatedFieldHyperlinkedRelatedField等字段来表示这些关系。

3. 序列化器的高级用法

  • 细节路由和超链接: 在序列化器中,您可以使用HyperlinkedModelSerializer来自动为模型实例生成超链接。这对于HATEOAS(Hypermedia as the engine of application state)风格的API非常实用。
  • 自定义字段和验证: 如果您需要对某个字段进行特定的验证或者处理,可以在序列化器中定义validate_<fieldname>方法。这给了您很大的灵活性来处理如何清理和验证来自用户的输入数据。
  • 多个表示形式: 有时您可能需要一个模型的多个序列化表示形式。在这种情况下,您可以为同一模型创建多个序列化器,并在视图中指定使用哪一个。

        通过灵活地使用序列化器,您可以精确控制数据的显示和提交方式。这是构建强大且安全Web API的关键步骤。现在我们已经了解了如何通过序列化器处理数据,接下来我们会深入到如何使用视图和路由来处理API的请求和响应。这将为我们提供一个完全功能的Web API,能够处理各种HTTP方法,如GET、POST、PUT和DELETE。

三、视图和路由

        在Django Rest Framework (DRF) 中,视图和路由紧密合作,用以处理传入的请求并返回相应的响应。视图是处理请求的逻辑部分,而路由则定义了这些视图如何与URLs关联。

1. 创建API视图

        DRF中的视图用于处理传入的请求并返回响应。您可以使用通用视图来简化开发流程。

  • 使用通用视图: DRF提供了一系列的通用视图,例如retrievelistcreateupdatepartial_update, 和 destroy。这些视图封装了API开发中的常见模式。
  • 自定义视图继承: 如果您的需求超出了通用视图提供的功能,您可以通过继承这些视图并重写其方法来自定义视图。例如,您可以重写get_queryset方法来自定义返回的数据。
from rest_framework import generics
from .models import YourModel
from .serializers import YourModelSerializer

class YourModelListCreateView(generics.ListCreateAPIView):
    queryset = YourModel.objects.all()
    serializer_class = YourModelSerializer

2. 配置路由

        路由的作用是将URL模式映射到相应的视图上。在DRF中,通常使用urls.py文件来配置这些路由。

  • 使用pathregister 在您的应用的urls.py文件中,使用path函数来定义哪些URL对应您的视图。如果使用路由器(如DefaultRouter),您还可以自动地为你的模型生成一套标准的API路由。
  • 自定义路由和视图绑定: 对于复杂的路由,您可以直接在urls.py中使用path精确控制URL结构,并将它们绑定到您的视图类上。
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import YourModelListCreateView

router = DefaultRouter()
router.register(r'yourmodel', YourModelListCreateView, basename='yourmodel')

urlpatterns = [
    path('', include(router.urls)),
]

3. 高级路由配置

  • 使用视图集: 视图集(ViewSets)允许您仅需定义一次视图逻辑,然后将其用在不同的路由上。这对于减少代码重复和维护大型API非常有用。
  • 复杂路由关系: 在某些情况下,您可能需要定义更复杂的路由关系。DRF支持使用第三方包如django-rest-framework-nested来处理嵌套的资源路由。

        通过定义细致的视图和灵活的路由,您可以精确控制API的行为和URL结构。这不仅提高了API的可维护性,也增强了用户体验。接下来,我们将讨论如何通过安全性和权限来保护您的API,确保数据的安全访问和操作。

四、安全性和权限

        保护您的API免受未经授权的访问是非常重要的。

1. 全局设置认证和权限

        您可以在settings文件中为整个API配置默认的认证和权限策略。

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.BasicAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    ],
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ],
}

2. 细节级别安全设置

        对于更细粒度的控制,您可以在视图级别上设置认证和权限。

class YourModelListCreateView(generics.ListCreateAPIView):
    authentication_classes = [SessionAuthentication, BasicAuthentication]
    permission_classes = [IsAdminUser, ]

五、测试和文档

        在开发任何应用程序,特别是Web API时,确保您的代码按预期工作是至关重要的。同时,一个好的API需要配备详细的文档,帮助开发者理解和使用接口。Django Rest Framework (DRF) 提供了工具和机制来帮助您轻松进行测试和生成文档。

1. 单元测试

单元测试是检查代码各个单元是否正常工作的过程。DRF提供了APITestCase类,它是Django的TestCase类的子类,专门用于API的测试。

  • 编写测试用例: 您应该为每个视图或视图集编写测试用例,确保它们正确处理请求和返回预期的响应。
  • 模拟请求与断言结果: 使用APIClient来发送模拟的HTTP请求到您的视图,并使用断言来验证响应数据。
from rest_framework.test import APITestCase
from rest_framework.status import HTTP_200_OK
from .models import YourModel

class YourModelApiTests(APITestCase):
    def test_create_yourmodel(self):
        url = reverse('yourmodel-list-create')
        response = self.client.post(url, {'field1': 'value1', 'field2': 'value2'}, format='json')
        self.assertEqual(response.status_code, HTTP_200_OK)

2. 集成测试和验收测试

  • 集成测试: 集成测试用来确保不同的部分(如模型、视图和路由)能够一起正常工作。这通常涉及测试整个API的交互。
  • 验收测试: 验收测试从用户的角度出发,确保系统符合业务需求。这包括测试API的端到端功能,确保它在实际使用中表现正常。

3. 文档生成

良好的文档对于任何API都是关键,DRF通过其自动文档生成工具使得创建文档变得简单。

  • 使用docstrings: 在您的代码中充分利用Python的docstrings来描述视图、序列化器和模型的功能。
  • 自动文档生成: DRF可以自动从您的API中提取信息,生成可读的文档页面。只需几行设置,即可激活此功能。
from rest_framework.documentation import include_docs_urls

urlpatterns += [
    path('docs/', include_docs_urls(title='My API title')),
]

六、总结

        在本指南中,我们深入探讨了使用Django Rest Framework (DRF) 构建Web API的五个关键步骤:环境设置、数据序列化、视图与路由配置、安全性和权限设置、以及测试和文档生成。每一步都是构建强大、安全且易于维护的API的关键组成部分。

  • 环境设置 确保了您的项目有正确的基础架构。
  • 数据序列化 是处理数据输入输出的核心,关系到数据的标准化和国际化。
  • 视图与路由配置 定义了API的行为和URL结构,直接影响到API的用户友好度和可扩展性。
  • 安全性和权限 保护您的API免受未授权访问,保证数据的安全和合法使用。
  • 测试和文档 保证了API的可靠性和易用性,有助于开发者更快地了解和使用API。

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

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

相关文章

c#Action委托和Func委托

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace Action委托 {internal class Program{static void PrintString(){Console.WriteLine("hello world.");}static void PrintInt(int …

我的Google Vertex AI实践经验分享

我的Google Vertex AI实践经验分享 前言 作为一名忙碌的开发者&#xff0c;我时常希望能减少睡眠时间以完成更多工作。在这个过程中&#xff0c;我尝试了多种方法&#xff0c;并设计了多个概念验证项目。本文分享了我在使用Google的生成式AI服务Vertex AI时的实践经验。需要注…

秋招突击——7/22——复习{堆——前K个高频元素}——新作{回溯——单次搜索、分割回文串。链表——环形链表II,合并两个有序链表}

文章目录 引言复习堆堆——前K个高频元素个人实现复习实现二参考实现 新作单词搜索个人实现参考实现 分割回文串个人实现参考实现 环形链表II个人实现参考实现 两个有序链表个人实现 总结 引言 又是充满挑战性的一天&#xff0c;继续完成我们的任务吧&#xff01;继续往下刷&a…

学习React(状态管理)

随着你的应用不断变大&#xff0c;更有意识的去关注应用状态如何组织&#xff0c;以及数据如何在组件之间流动会对你很有帮助。冗余或重复的状态往往是缺陷的根源。在本节中&#xff0c;你将学习如何组织好状态&#xff0c;如何保持状态更新逻辑的可维护性&#xff0c;以及如何…

【SpingCloud】客户端与服务端负载均衡机制,微服务负载均衡NacosLoadBalancer, 拓展:OSI七层网络模型

客户端与服务端负载均衡机制 可能有第一次听说集群和负载均衡&#xff0c;所以呢&#xff0c;我们先来做一个介绍&#xff0c;然后再聊服务端与客户端的负载均衡区别。 集群与负载均衡 负载均衡是基于集群的&#xff0c;如果没有集群&#xff0c;则没有负载均衡这一个说法。 …

CSS:顶部导航栏固定位置、分类标题栏、底部提示文案固定位置

一、效果图 页面body的css代码 body {position: absolute;width: 100%;height: 100vh;padding: 0;margin: 0;top: 0;left: 0;bottom: 0;background-color #eee;/* overflow: auto;overflow-y: scroll; *//* ::-webkit-scrollbar {display: none;} */ }.content-root {width: 1…

python多进程加速函数运行

python多进程运行可以使函数运行在程序主进程以外&#xff0c;减少主进程的调用&#xff0c;并且可以加速子进程的运行速度   为了测试多进程的加速效果&#xff0c;我们可以通过创建一个包含计算密集型任务的函数&#xff0c;并使用多进程来并行执行这些任务。我们将对比单进…

Telegram曝零日漏洞,可伪装成视频攻击安卓用户

ESET Research在一个地下论坛上发现了一个针对Android Telegram的零日漏洞广告。 ESET将该漏洞命名为“EvilVideo”&#xff0c;并将其报告给Telegram&#xff0c;Telegram于7月11日更新了该应用程序。 EvilVideo允许攻击者发送恶意的有效载荷&#xff0c;这些载荷以视频文件…

《白话机器学习的数学》第2章——学习回归

2.1设置问题 1.机器学习所做的事情正是从数据中进行学习&#xff0c;然后给出预测值。 2.2定义模型 1.一次函数的表达式&#xff1a; 其中θ叫做参数。 在统计学领域&#xff0c;人们常常使用 θ 来表示未知数和推测值。采用 θ加数字下标的形式&#xff0c;是为了防止当未知数…

熟悉set/map了解KV模型和pair结构

set基本介绍 set是key模型,本质是确定一个 元素在不在此容器中,也就是说 set中存储的是一个单一数据 1. set是按照一定次序存储元素的容器 2. 在set中&#xff0c;元素的value也标识它(value就是key&#xff0c;类型为T)&#xff0c; 并且每个value必须是唯一的。set中的元素不…

PHP教程001:PHP介绍和环境配置

文章目录 1、php是什么2、php能做什么3、php程序执行流程4、需要什么基础5、环境介绍5.1、WEB环境5.2、环境集成包3、phpStudio软件下载 1、php是什么 通用&#xff1a;跨平台&#xff0c;如windows、Linux、MacOS开源免费服务器端脚本语言 2、php能做什么 可以快速动态的生…

群管机器人官网源码

一款非常好看的群管机器人html官网源码 搭建教程&#xff1a; 域名解析绑定 源码文件上传解压 访问域名即可 演示图片&#xff1a; 群管机器人官网源码下载&#xff1a;客户端下载 - 红客网络编程与渗透技术 原文链接&#xff1a; 群管机器人官网源码

很酷的仿真翻页书HTML源码,书本页面是加载的图片,基于JQuery实现的翻页特效,结合一些js插件,看起来很酷,在实现在线翻书项目。

仿真翻页书HTML源码https://www.bootstrapmb.com/item/14742 创建一个仿真的翻页书效果在HTML和CSS中可以通过多种方式实现&#xff0c;但通常这也会涉及到JavaScript&#xff08;或jQuery&#xff09;来处理交互和动画。以下是一个简单的示例&#xff0c;展示如何使用HTML、…

openssl 加密

使用tar命令在Linux中加密文件可以通过两种方式实现&#xff1a;使用gzip压缩的同时加密&#xff0c;或者使用加密选项。 1. 使用gzip压缩的同时加密&#xff1a; “ tar cz file1 file2 | openssl enc -e -aes256 -out archive.tar.gz.enc “ – cz&#xff1a;创建tar压缩文…

【数学建模】基于贪心算法的电力市场的输电阻塞管理(附论文及matlab、lingo代码)

适合数学建模新手研究的题目&#xff0c;备战国赛的同学可以拿这道题目练手&#xff0c;本文含论文代码&#xff0c;帮助解题理解思路。 题目&#xff1a; &#xff08;1&#xff09;题目信息&#xff1a; 某电网有若干台发电机组和若干条主要线路&#xff0c;每条线路上的有…

k8s中部署nacos

1 部署nfs # 在k8s的主节点上执行 mkdir -p /appdata/download cd /appdata/download git clone https://github.com/nacos-group/nacos-k8s.git 将nacos部署到middleware的命名空间中 kubectl create namespace middleware cd /appdata/download/nacos-k8s # 创建角色 kub…

鸿蒙界面开发

界面开发 //构建 → 界面 build() {//行Row(){//列Column(){//文本 函数名(参数) 对象.方法名&#xff08;参数&#xff09; 枚举名.变量名Text(this.message).fontSize(40)//设置文本大小.fontWeight(FontWeight.Bold)//设置文本粗细.fontColor(#ff2152)//设置文本颜色}.widt…

乐鑫ACK方案低成本设备开发,智能家居无线技术应用,启明云端乐鑫代理商

随着智能家居行业的蓬勃发展&#xff0c;用户对于智能设备的需求日益增长。乐鑫以其创新的Alexa Connect Kit (ACK) 方案&#xff0c;开启了智能家居设备开发的新篇章。 Alexa Connect Kit&#xff08;ACK&#xff09;方案&#xff0c;不仅提供了一个集成Alexa语音服务的高效开…

Redis八股文(一)

目录 1.什么是Redis&#xff1f; 2.Redis和Memcached有什么区别&#xff1f; 3.为什么Redis作为MySQL的缓存&#xff1f; 4.Redis数据类型及其使用场景分别是什么&#xff1f; 5.五种常见数据类型是怎么实现的&#xff1f; 6.Redis是单线程吗&#xff1f; 7.Redis单线程…

iterm2工具的使用|MAC电脑终端实现分屏|iterm2开启滚动操作

iterm2 工具概括 iTerm2 是一款非常强大的终端工具。 iTerm2 最初是为 macOS 开发的,但也有 Windows 、Linux 发行版&#xff08;Ubuntu、centos…&#xff09;可用。 应用场景 Mac操作系统中想实现终端分屏 iterm2 工具特点 多标签和分屏: 可以在同一个窗口中打开多个标签…