当前位置: 首页 > news >正文

Python web实战之Django 的 RESTful API 设计详解

          


 

关键词: Python, Web 开发, Django, RESTful API

1 API的一些事儿

1.1 什么是API?

API是应用程序编程接口(Application Programming Interface)的缩写。它是一种定义了不同软件组件之间交互方式的规范。API允许不同的应用程序之间进行通信和数据交换,使得开发者能够利用其他应用程序提供的功能和数据,而无需了解其内部实现细节。

在Web开发中,API通常是用于构建和访问Web服务的一种方式。通过API,开发者可以通过HTTP请求发送和接收数据,从而实现不同应用程序之间的数据传输和交互。

1.2 Web开发的API类型

在Web开发中,有几种常见的API类型:

1.2.1. Web服务API(Web Service APIs):

这种API使用标准的Web技术(如HTTP和XML)来进行通信。其中两种常见的Web服务API类型是SOAP和REST。

  • SOAP(Simple Object Access Protocol):
    它使用XML格式进行数据交换,并通过HTTP或其他协议传输。SOAP提供了一种基于XML的通信机制,通过定义消息结构和服务操作来描述API。SOAP API通常使用WSDL(Web Services Description Language)来定义API的结构和操作。

  • REST(Representational State Transfer):
    它是一种基于Web的轻量级架构风格。REST API使用HTTP协议的不同方法(如GET、POST、PUT、DELETE)来执行对数据的操作。它通常使用JSON或XML格式进行数据交换。REST API是目前最常用的Web服务API类型。

1.2.2. 第三方API(Third-Party APIs):

这些API由第三方提供,允许开发者访问其服务或数据。例如,社交媒体平台(如Twitter和Facebook)提供API,使开发者能够使用其平台上的功能和数据。第三方API通常使用REST风格,并要求开发者进行身份验证以获得访问权限。

1.2.3. 自定义API:

在Web开发中,你也可以构建自己的自定义API来为你的应用程序提供服务。这些API可以根据应用程序的需求进行设计和实现,并使用标准的Web技术进行通信。

2 RESTful API 简介

在进一步了解 Django 如何设计 RESTful API 之前,我们先来了解一下 RESTful API 的基本概念和原则。

2.1 什么是 RESTful API?

RESTful API(Representational State Transfer)是一种设计风格,用于构建分布式系统中的网络服务。它基于一组简洁的原则和约束,使得不同的系统可以通过 HTTP 协议进行通信和交互。

2.2 RESTful API 的原则

RESTful API 的设计原则如下:

  1. 资源:将系统中的实体(资源)抽象为统一的资源模型,通过 URI(统一资源标识符)进行唯一标识。

  2. 动词:使用 HTTP 方法(GET、POST、PUT、DELETE 等)来表示对资源的不同操作。

  3. 状态转移:通过请求的状态转移(如创建、更新、删除等)来实现对资源的操作。

  4. 无状态:每个请求都是独立的,服务器不会保存客户端的状态信息。

3 Django 的 RESTful API 设计实践

好了,现在我们已经对 Django 和 RESTful API 有了初步的了解,接下来让我们深入探讨 Django 框架下的 RESTful API 设计实践。我将带你逐步实现一个具有实用功能的示例项目,让你更好地理解和掌握 Django 的 API 设计技巧。

3.1 项目介绍

这个项目是一个简单的待办事项管理应用。用户可以创建、查看、更新和删除待办事项。这个项目将帮助我们了解如何设计符合 RESTful API 原则的 Django 应用程序。

3.2 创建 Django 项目

首先创建一个 Django 项目。打开你的终端或命令提示符,使用以下命令创建一个新的 Django 项目:

django-admin startproject todoapp

运行后会创建一个名为 todoapp 的新目录,并在其中生成 Django 项目的初始结构。

3.3 创建应用程序

接下来创建一个 Django 应用程序。在终端中进入 todoapp 目录,并运行以下命令:

python manage.py startapp todos

3.4 定义数据模型

在我们开始设计 API 视图之前,我们需要定义待办事项的数据模型。打开 todos/models.py 文件,在其中添加以下代码:

from django.db import modelsclass Todo(models.Model):title = models.CharField(max_length=200)description = models.TextField()created_at = models.DateTimeField(auto_now_add=True)completed = models.BooleanField(default=False)def __str__(self):return self.title

这里我们定义了一个名为 Todo 的数据模型,它包含了 titledescriptioncreated_at 和 completed 字段。__str__ 方法用于返回模型对象的字符串表示。

3.5 创建 API 视图

现在,我们可以开始创建 API 视图了。在 todos/views.py 文件中,添加以下代码:

from rest_framework import viewsets
from .models import Todo
from .serializers import TodoSerializerclass TodoViewSet(viewsets.ModelViewSet):queryset = Todo.objects.all()serializer_class = TodoSerializer

这里我们使用 Django REST Framework 提供的 viewsets.ModelViewSet 类来定义一个视图集。我们指定了查询集和序列化器类,Django REST Framework 将自动生成常见的 CRUD(创建、读取、更新、删除)操作。

3.6 配置 URL 路由

为了让 Django 知道如何映射 URL 到我们的 API 视图,我们需要配置 URL 路由。打开 todoapp/urls.py 文件,并添加以下代码:

from django.urls import include, path
from rest_framework import routers
from todos.views import TodoViewSetrouter = routers.DefaultRouter()
router.register(r'todos', TodoViewSet)urlpatterns = [path('', include(router.urls)),
]

这里我们使用 Django REST Framework 提供的 DefaultRouter 类来自动生成 URL 路由,并将 TodoViewSet 视图注册到 /todos 路径下。

等效于手动配置以下路由:

GET /todos/:获取所有待办事项的列表
POST /todos/:创建新的待办事项
GET /todos/{pk}/:获取特定待办事项的详细信息
PUT /todos/{pk}/:更新特定待办事项的详细信息
PATCH /todos/{pk}/:部分更新特定待办事项的详细信息
DELETE /todos/{pk}/:删除特定待办事项

3.7 运行开发服务器

现在已经完成了 API 视图和 URL 路由的配置。可以启动 Django 开发服务器了,然后测试 API。在终端中运行以下命令:

python manage.py runserver

服务器启动后,你可以在浏览器中访问 http://localhost:8000/todos 来查看 API 的根路径。还可以使用工具如 Postman 来测试 API。

3.8 示例代码总结

通过以上步骤,我们成功地创建了一个简单的待办事项管理 API。我们定义了数据模型、创建了 API 视图,并通过 URL 路由将其映射到相应的路径上。后续可以根据自己的需求扩展和定制这个 API,

3.9 添加序列化器

项目要使用了序列化器来将模型数据转换为 JSON 格式。现在创建一个序列化器来定义如何序列化和反序列化待办事项模型。

在 todos/serializers.py 文件中,添加以下代码:

from rest_framework import serializers
from .models import Todoclass TodoSerializer(serializers.ModelSerializer):class Meta:model = Todofields = '__all__'

这里我们导入了 serializers 模块,并创建了一个名为 TodoSerializer 的序列化器类,指定了模型类和要序列化的字段集合。可以使用 '__all__' 表示序列化所有字段。

3.10 运行数据库迁移

在使用新的数据模型和序列化器之前,需要运行数据库迁移以创建相应的数据表。在终端中运行以下命令:

python manage.py makemigrations
python manage.py migrate

3.11 测试 API

现在,我们已经完成了 API 的设计和配置。让我们测试一下我们的 API 是否正常工作。

可以使用浏览器或者 API 测试工具发送 HTTP 请求来测试 API。以下是一些示例请求:

  • 获取所有待办事项:发送 GET 请求到 http://localhost:8000/todos/

  • 创建新的待办事项:发送 POST 请求到 http://localhost:8000/todos/,并在请求体中包含待办事项的数据。

  • 获取单个待办事项:发送 GET 请求到 http://localhost:8000/todos/{id}/,其中 {id} 是待办事项的 ID。

  • 更新待办事项:发送 PUT 或 PATCH 请求到 http://localhost:8000/todos/{id}/,并在请求体中包含更新后的待办事项数据。

  • 删除待办事项:发送 DELETE 请求到 http://localhost:8000/todos/{id}/,其中 {id} 是待办事项的 ID。

可根据你的需求和工具的要求进行请求测试。

3.12 鉴权和权限控制

在实际应用中,通常需要对 API 进行鉴权和权限控制,以确保只有授权用户可以访问和修改数据。

Django REST Framework 提供了各种鉴权和权限控制的选项。例如,你可以使用 Token 认证、JWT(JSON Web Token)认证或基于 OAuth 的认证来保护你的 API。

你还可以使用装饰器(类似注解的概念)、权限类和视图集的属性来定义各种访问控制规则,例如只允许拥有特定权限的用户进行操作。

关于这个详细的内容比较多,我们后续另起一篇文章分享。

3.13 其他功能和扩展

Django REST Framework 提供了许多其他功能和扩展,帮助你更好地构建和管理 RESTful API。

一些常见的功能和扩展包括:

  • 分页:处理大量数据时,可以使用分页功能来限制结果集的大小,并提供下一页和上一页的链接。

  • 过滤和搜索:允许用户根据指定的条件过滤和搜索数据。

  • 排序:允许用户按照指定的字段对数据进行排序。

  • 版本控制:允许你管理和控制不同版本的 API 接口。

  • 缓存:提供缓存功能,提高 API 的性能和响应速度。

今天的分享就到这里,如果文章的内容对你有所帮助,欢迎点赞收藏转发,感谢。

相关文章:

Python web实战之Django 的 RESTful API 设计详解

关键词: Python, Web 开发, Django, RESTful API 1 API的一些事儿 1.1 什么是API? API是应用程序编程接口(Application Programming Interface)的缩写。它是一种定义了不同软件组件之间交互方式的规范。API允许不同的应用程序之间进行通信和…...

Python 程序设计入门(014)—— Python 的 Lambda 函数(匿名函数)

Python 程序设计入门(014)—— Python 的 Lambda 函数(匿名函数) 目录 Python 程序设计入门(014)—— Python 的 Lambda 函数(匿名函数)一、匿名函数的定义二、匿名函数的特征三、匿…...

【MySQL系列】表约束的学习

「前言」文章内容大致是MySQL的表的约束。 「归属专栏」MySQL 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 一、MySQL表的约束1.1 空属性1.2 默认值(default)1.3 列描述(comment)1.4 zerofill1.5 主键(primary ke…...

低功耗LoRaWAN国产低功耗LoRa+RF射频前端芯片XD6500S

目录 典型应用XD6500S简介芯片特性 LoRa系列选型参考 LoRa是为低数据速率、远距离距离和超低功耗而优化的扩频协议,用于LPWAN应用程序的通信。 典型应用 一、智慧农业   智慧农业大田解决方案利用传感设备、自动化控制设备、气象站实时监测采集田间土壤墒情、气象…...

【基础IO】文件系统 {磁盘的物理结构,存储结构,逻辑结构;CHS 和 LBA 寻址方式;磁盘分区和块组;文件inode;软硬链接}

文件系统 文件分为: 内存文件:被进程打开的文件,文件被加载到内存中供进程快速读写。磁盘文件:没有被打开的文件,保存在磁盘上。磁盘文件被分门别类的存储和管理,用于支持更好的存取。 提示: …...

全角字符和半角字符

全角字符的由来 全角符号是双字节中文编码的历史遗留问题。当年在纯文本的界面中,为了让西文和中日韩的方块字对齐,就让西文字母、数字和标点也占用一个汉字的视觉空间,并使用 2 个字节存储。后来,其中的一些全角字符因为比较有用…...

【java】【经验】java: 错误: 不支持发行版本 6

前言:配置过maven之后,发现原来的一些项目运行提示java: 错误: 不支持发行版本 6或者java: 错误: 不支持发行版本 5,主要原因:是因为项目使用的Java版本和安装的Java版本不符合 目录 1 设置项目java版本 2 设置模块版本 3 set…...

Spring Boot3.0(四):Thymeleaf 使用详解

Thymeleaf 介绍 简单说,Thymeleaf 是一个跟 Velocity、FreeMarker 类似的模板引擎,它可以完全替代 JSP 。相较与其他的模板引擎,它有如下三个极吸引人的特点: 1.Thymeleaf 在有网络和无网络的环境下皆可运行,即它可以…...

杨辉三角【Java二维数组】

这个代码中,我们定义了一个二维数组nums来存储杨辉三角的每一个数字。在for循环中,我们初始化每一行的第一个和最后一个数字,并且根据上一行的数字来计算出中间的数字。 接着,我们使用两个嵌套的for循环来输出杨辉三角。第一个循…...

解决SpringBoot服务返回数据存在$ref $.data等相关问题

1、场景 ​ 在日常的开发中,我们数据接口返回数据使用了FastJson序列化数据,当返回一个数据list时候出现" r e f " " ref" " ref"".data" 等类似乱码一样的数据,当时我比较匪夷所思,我写…...

【iOS安全】开启任意app的WebView远程调试

参考:https://mp.weixin.qq.com/s/bNKxQaVrPaXsZ5BPbsXy7w (来自周智老师的公众号) 概述 Safari 有一个内置的前端调试器, 在iPhone通过局域网或者USB连接MacBook 并启用Safari 远程调试之后,前端调试器默认情况下对…...

windows下 java程序无窗口启动、无窗口启动java -jar

创建一个.bat文件,其他照抄,注意一下你自己的jar包路径和日志路径:例:java -jar C:\data\operation-1.0-SNAPSHOT.jar > C:\data\log.log 2>&1 & ------------文件内容 echo off %1 mshta vbscript:CreateObject(…...

锦程消费金融业务生变:App下架,部分自营信贷暂停

来源 | 镭射财经(leishecaijing) 被誉为消金房抵一哥的锦程消费金融,调整旗下自营信贷业务,展业回归房抵场景。 「镭射财经」独家获悉,锦程消费金融已暂停部分自营小额信贷业务,旗下锦囊贷App已经下架&am…...

Python爬虫在框架下的合规操作与风险控制

大家好!作为一名专业的爬虫代理供应商,我今天要和大家分享一些关于Python爬虫在法律框架下的合规操作与风险控制的知识。随着互联网的发展,数据爬取在商业和研究领域扮演着重要的角色,但我们也必须遵守相关法律和规定,…...

前端页面如何创建表格?table的结构、属性有哪些?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ HTML是什么?⭐ table标签的属性⭐ 注意事项⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏…...

神码ai伪原创工具【php源码】

大家好,小编为大家解答python炫酷烟花表白源代码的问题。很多人还不知道html代码烟花特效python,现在让我们一起来看看吧! 火车头采集ai伪原创插件截图: 目录 前言 环境准备 代码编写 效果展示 前言 Python实现浪漫的烟花特效 现在…...

Linux命令200例:mkdir用于创建目录(常用)

🏆作者简介,黑夜开发者,全栈领域新星创作者✌。CSDN专家博主,阿里云社区专家博主,2023年6月csdn上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责人。 &…...

C语言内嵌汇编

反编译(二进制文件或者so库) objdump --help objdump -M intel -j .text -ld -C -S out > out.txt #显示源代码同时显示行号, 代码段反汇编-M intel 英特尔语法-M x86-64-C:将C符号名逆向解析-S 反汇编的同时,将反汇编代码和源代码交替显…...

《网络是怎样连接的》(三)

《网络是怎样连接的》(二.2)_qq_38480311的博客-CSDN博客 本文主要取材于 《网络是怎样连接的》 第三章。 简述:本文主要内容是解释 通过网线传输出去的包是如何经过集线器、交换机和路由器等网络设备,最终进入互联网的。 信号…...

SpringBoot 配置文件

一、配置文件作用 整个项目中所有重要的数据都是在配置文件中配置的,比如: 数据库的连接信息(包含用户名和密码的设置); 项目的启动端口; 第三方系统的调用秘钥等信息; 用于发现和定位问题的…...

【K8S】 deployment.yaml文件与Service yaml文件详解

目录 deployment.yaml文件详解Service yaml文件详解 deployment.yaml文件详解 apiVersion: extensions/v1beta1 #接口版本 kind: Deployment #接口类型 metadata:name: cango-demo #Deployment名称namespace: cango-prd #命名空间l…...

GMSL 9296芯片对GMSL链路 插损/回损/线束要求

基于美信 9296的芯⽚ 对于GMSL信号链路上的需求如下: 1:插损 频段2M~3.5GHZ 在3G时需要⼩于-21db。通信速率 6Gbps/187Mbps 频段2M~3.5GHZ 在3G时需要⼩于-18db。通信速率 6Gbps/1.5Gbps 频段2M~2GHZ 在1.5G时需要⼩于-19.5db。通信速率 3Gbps/187Mbps …...

用库造一个list的轮子 【C++】

文章目录 list的模拟实现默认成员函数构造函数拷贝构造函数赋值运算符重载析构函数 迭代器迭代器为什么要存在?const_iteratorbegin和end inserterasepush_back && pop_backpush_front &&pop_frontswap 完整代码 list的模拟实现 默认成员函数 构造…...

java中的,>>,<<位运算

目录 二进制 >>,<< & 二进制 计算机内部使用二进制计数 二进制&#xff1a;在数学和数字电路中指以2为基数的记数系统&#xff0c;以2为基数代表系统是二进位制的&#xff0c;这一系统中&#xff0c;通常用两个不同的符号0&#xff08;代表零&#xff09;和…...

成功解决Android设备adb连接后显示device unauthorized

一、提出问题 在电脑通过USB连接新的Android设备&#xff0c;想要通过adb来进行一些操作时&#xff0c;却发现命令提示符上在输入下面命令后显示设备未授权的信息也就是"unauthorized" adb devices二、不可行的解决方案 有人提出的解决方案是打开Android设备的开发…...

初识mysql数据库之引入mysql客户端库

目录 一、下载第三方库 1. 准备工作 1. 使用mysql官网提供的库 2. yum源安装 二、测试第三方库是否可用 三、mysql常用接口介绍 1. 查看官方文档 2. 初始化 3. 关闭mysql 4. 连接mysql 5. 下达sql指令 四、一个简单的C客户端库连接mysql程序 1. 头文件 2. 初始化…...

勘探开发人工智能技术:机器学习(1)

0 提纲 2.1 什么是机器学习 2.2 不确定性 2.3 数据类型 2.4 分类、回归、聚类 2.5 分类问题的训练与测试 2.6 性能评价指标 1 什么是机器学习 对于西瓜这个抽象类来说&#xff0c;它具有“色泽”&#xff0c;“根蒂”&#xff0c;“敲声”三个属性&#xff1a; 通过观察这个…...

MySQL查看当前数据库视图-SQL语句

引言 查询语句为&#xff1a; show full tables where table_type 可查询当前数据库表 一&#xff0c;创建一个视图 # 创建视图 create view v_stu as # 视图内容&#xff08;连接的一个表&#xff09; select name from t_stu union all select tname from t_teach; 二&…...

Clickhouse 存储引擎

一、常用存储引擎分类 1.1 ReplacingMergeTree 这个引擎是在 MergeTree 的基础上&#xff0c;添加了”处理重复数据”的功能&#xff0c;该引擎和MergeTree的不同之处在于它会删除具有相同主键的重复项。 特点: 1使用ORDERBY排序键作为判断重复的唯一键 2.数据的去重只会在合并…...

基于golang多消息队列中间件的封装nsq,rabbitmq,kafka

基于golang多消息队列中间件的封装nsq,rabbitmq,kafka 场景 在创建个人的公共方法库中有这样一个需求&#xff0c;就是不同的项目会用到不同的消息队列中间件&#xff0c;我的思路把所有的消息队列中间件进行封装一个消息队列接口&#xff08;MQer&#xff09;有两个方法一个…...

做网站用微软雅黑侵权吗/it培训课程

AsyncTask<Params, Progress, Result>中三个参数为&#xff1a;Params 输入数据Progress 过程数据Result 结果数据工作队列 LinkedlockingQueue 的特性线程从空的LinkedlockingQueue中取任务执行&#xff0c;线程会被阻塞&#xff1b;线程向一个…...

wordpress设置回复可见/网站免费推广

一、HTML什么是HTML?HTML是一种用来描述网页的一种语言&#xff0c;是一套规则&#xff0c;被浏览器认识的规则HTML指的是超文本标记语言(Hyper Text Markup Languag对于开发者来说学习HTML规则开发后台程序&#xff1a;-写HTML文件(充当模板的作用)-把从数据库中获取的数据和…...

德阳住房和城乡建设厅网站/qq群推广方法

IOS的逆向签名方法 1.将.ipa文件解压->Payload->右击.app文件&#xff0c;显示包内容->找到embedded.mobileprovision文件->将其拷贝出来&#xff0c;以便后面使用2.若没有安装homebrew,ruby,sign,则先依次安装3.homebrew的安装方式&#xff1a;curl -LsSf http://…...

cn域名多少钱一年/seo资料

江西职业学校计算机专业好不计算机网络技术专业普通开设于大学中计算机相关的院系中&#xff0c;比方计算机学院、信息技术系等&#xff0c;各院校也会依据本人优势开设不同的培育方向&#xff0c;主要是培育可以担任“用网、组网、管网、建网”等实践工作的高级网络技术人才。…...

h5建设网站教程/铜仁搜狗推广

一、前言 很多数据库系统性能不理想是因为系统没有经过整体优化&#xff0c;存在大量性能低下的SQL 语句。这类SQL语句性能不好的首要原因是缺乏高效的索引。没有索引除了导致语句本身运行速度慢外&#xff0c;更是导致大量的磁盘读写操作&#xff0c;使得整个系统性能都受之影…...

龙岩新闻网/长沙官网seo推广

二分查找&#xff1a; 引用网上大神的一句话&#xff1a; Although the basic idea of binary search is comparatively straightforward, the details can be surprisingly tricky... 这句话可以这样理解&#xff1a;思路很简单&#xff0c;细节是魔鬼。 所以本文中讲述的都是…...