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 models

class 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 TodoSerializer

class 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 TodoViewSet

router = 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 Todo

class TodoSerializer(serializers.ModelSerializer):
    class Meta:
        model = Todo
        fields = '__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 的性能和响应速度。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

kubernetes基于helm部署gitlab-operator

kubernetes基于helm部署gitlab-operator 这篇博文介绍如何在 Kubernetes 中使用helm部署 GitLab-operator。 先决条件 已运行的 Kubernetes 集群负载均衡器,为ingress-nginx控制器提供EXTERNAL-IP,本示例使用metallb默认存储类,为gitlab p…

AWD攻防学习总结(草稿状态,待陆续补充)

AWD攻防学习总结 防守端1、修改密码2、备份网站3、备份数据库4、部署WAF5、部署文件监控脚本6、部署流量监控脚本/工具7、D盾扫描,删除预留webshell8、代码审计,seay/fortify扫描,漏洞修复及利用9、时刻关注流量和积分信息,掉分时…

Java经典面试题总结(一)

Java经典面试题总结(一) 题一:Java编译运行原理题二:JDK,JVM,JRE三者之间的关系题三:谈一下对冯诺依曼体系的了解题四:重载与重写的区别题五:拆箱装箱是指什么&#xff1…

在矩池云使用ChatGLM-6B ChatGLM2-6B

ChatGLM-6B 和 ChatGLM2-6B都是基于 General Language Model (GLM) 架构的对话语言模型,是清华大学 KEG 实验室和智谱 AI 公司于 2023 年共同发布的语言模型。模型有 62 亿参数,一经发布便受到了开源社区的欢迎,在中文语义理解和对话生成上有…

Flink多流处理之connect拼接流

Flink中的拼接流connect的使用其实非常简单,就是leftStream.connect(rightStream)的方式,但是有一点我们需要清楚,使用connect后并不是将两个流给串联起来了,而是将左流和右流建立一个联系,作为一个大的流,并且这个大的流可以使用相同的逻辑处理leftStream和rightStream,也可以…

学习pytorch

学习pytorch 1. 环境安装配置镜像源conda命令记录遇到的问题1. torch.cuda.is_available() False 1. 环境安装 B站小土堆视频 配置镜像源 conda config --show channels conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/mainhttp://www.m…

canvas实现代码雨

学习抖音&#xff1a; 渡一前端必修课 效果图&#xff1a; 全部代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge">&…

idea使用protobuf

本文参考&#xff1a;https://blog.csdn.net/m0_37695902/article/details/129438549 再次感谢分享 什么是 protobuf &#xff1f; Protocal Buffers(简称protobuf)是谷歌的一项技术&#xff0c;用于结构化的数据序列化、反序列化。 由于protobuf是跨语言的&#xff0c;所以用…

【Linux命令行与Shell脚本编程】第十六章 Shell函数

Linux命令行与Shell脚本编程 第一章 文章目录 Linux命令行与Shell脚本编程六.函数6.1.脚本函数基础6.1.1.创建函数6.1.2.使用函数 6.2.函数返回值6.2.1.默认的退出状态码6.2.2.使用return命令6.2.3.使用函数输出 6.3.函数中使用变量6.3.1.向函数传递参数6.3.2.在函数中处理变量…

Spring 是如何解决循环依赖问题的?

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 例如&#xff1a;项目场景&#xff1a;示例:通过蓝牙芯片(HC-05)与手机 APP 通信&#xff0c;每隔 5s 传输一批传感器数据(不是很大) 问题描述 我们都知道&#xff0c;如果在代码中&#xff0c;将两个…

机器学习深度学习——循环神经网络RNN

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习—语言模型和数据集 &#x1f4da;订阅专栏&#xff1a;机器学习&&深度学习 希望文章对你们有所帮助…

c++ 运算符重载

为什么要有运算符重载&#xff1f; 观察下列代码&#xff0c;当我们要比较两个日期类(自定义类型)的大小的时候&#xff0c;我们没法使用编译器自带的小于<符号来比较&#xff0c;就像这样的形式&#xff1a;d1 < d2 我们需要自己写一个函数来进行比较&#xff0c;这是很…

YOLOv5源码中的参数超详细解析(2)— 配置文件yolov5s.yaml

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。YOLOv5配置了5种不同大小的网络模型&#xff0c;分别是YOLOv5n、YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x&#xff0c;其中YOLOv5n是网络深度和宽度最小但检测速度最快的模型&#xff0c;其他4种模型都是在YOLOv5n的基础上不断…

深度补全算法-CompletionFormer-已开源效果最好

《CompletionFormer: Depth Completion with Convolutions and Vision Transformers 》 摘要 给定稀疏深度和相应的 RGB 图像&#xff0c;深度补全旨在整个图像中空间传播稀疏测量值&#xff0c;以获得密集的深度预测。尽管基于深度学习的深度补全方法取得了巨大进步&#xff0…

分清性能测试,负载测试,压力测试这三个的区别

做测试一年多来&#xff0c;虽然平时的工作都能很好的完成&#xff0c;但最近突然发现自己在关于测试的整体知识体系上面的了解很是欠缺&#xff0c;所以&#xff0c;在工作之余也做了一些测试方面的知识的补充。不足之处&#xff0c;还请大家多多交流&#xff0c;互相学习。 …

从 GPT4All 体验 LLM

推荐&#xff1a;使用 NSDT场景编辑器 助你快速搭建可编辑的3D应用场景 什么是 GPT4All&#xff1f; 术语“GPT”源自 Radford 等人 2018 年论文的标题“通过生成预训练提高语言理解”。本文描述了如何证明变压器模型能够理解人类语言。 从那时起&#xff0c;许多人尝试使用转…

UNIX 入门

与 UNIX 建立连接启动会话登录命令提示符修改口令退出系统 简单的 UNIX 命令命令格式ls 命令who 命令虚拟终端 tty伪终端 ptywho am i 命令 cal 命令help 命令man 命令 shell 概述shell 命令更换 shell临时更改 shell永久更改 shell 登录过程 与 UNIX 建立连接 启动会话 要启…

爬虫010_列表高级_添加_append_extend_修改_查询_in_not int_删除_del_pop_remove---python工作笔记029

然后再来看列表操作 首先添加append方法 然后插入,坐标是要插入的下标,右边是插入的内容 看结果 1,2,3,4,5,6 然后这个extend,是逐个插入,放到后边 然后是修改,直接对下标赋值 看结果</

Matlab之利用MarkerFaceColor来填充marker

matlab画图在加一些marker的时候, 有实心的圆圈, 比如: plot(x,y,.r,MarkerSize,20)但是如果想要一个很大的marker, 就需要把这个markersize调得很大, 比如MarkerSize20 但是也可以用空心的圆圈然后把中间涂上颜色, 这样调整起来更方便. 比如: plot(x,y,or,MarkerSize,5,Mar…

【LeetCode每日一题】——219.存在重复元素II

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 哈希表 二【题目难度】 简单 三【题目编号】 219.存在重复元素II 四【题目描述】 给你一个…