Python 框架学习 Django篇 (四) 数据库增删改查(CURD)
在上一章结尾我们了解到如采用前后端开发分离的架构模式开发,后端几乎不负责任何展现界面的工作,只负责对数据进行管理 ,对数据的管理主要体现在:
(增加、修改、删除、列出)具体的接口参考大佬的文档BYSMS系统 API 接口 1.0 | 白月黑羽 本章只做练习
一、添加应用、路由分发、api规划
接口文档明确说明了这是针对管理员用户的请求,我们在前面创建过一个paas的应用专门处理paas相关的请求,所以我们可以再为管理员用户专门创建一个应用mgr来处理相关的 请求
1、创建 mgr应用目录
python manage.py startapp mgr

2、添加处理请求模块 和 url 路由
前面我们都是直接把函数写到应用的views.py文件里面来处理http请求的,后续如果我们需要添加的函数数量非常多就不方便了,我们可以定义多个函数文件来处理这种请求,比如定义cluster.py 来处理集群相关的请求,sql.py 处理数据库方面的请求
接口文档案例
GET /api/mgr/customers?action=list_customer HTTP/1.1#请求参数
http 请求消息 url 中 需要携带如下参数是action 填写的值为list_customer
通过接口文档可以看到对资源的增删改查操作都是同一个URL(/api/mgr/customers)
而不同的请求操作,使用了不同的方法 GET POST PUT DELETE
3、路由分发函数
Django 的 url路由功能 不支持 根据 HTTP 请求的方法 和请求体里面的参数 进行路由,如下
path('customers/', 'app.views.list_customer', method='get'),
path('customers/', 'app.views.add_customer', method='post'),
碰到这种情况,我们可以编写一个函数去将所有请求做条件判断,转发给不同的函数处理
按照接口文档的url,我们需要将/api/mgr/开头的请求都交给mgr的应用路由处理
vi Django_demo/Django_demo/urls.py
#添加路由分支,将api/mgr/ 转交给mgr应用下的子路由
path('api/mgr/', include('mgr.urls')),
vi Django_demo/Django_demo/settings.py
INSTALLED_APPS = ['simpleui','django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','paas','mgr', #添加
]
我们添加了应用配置和路由方向了,下面我们应该去定义api所在的文件和具体的路由配置
定义api函数
vi Django_demo/mgr/k8s.py
import jsonfrom django.http import JsonResponse
from django.shortcuts import renderdef dispatcher(request): # 将请求参数统一放入request 的 params 属性中,方便后续处理# 判断应用的请求模式为GET时,取出请求后续的内容if request.method == 'GET':request.params = request.GET# POST/PUT/DELETE 请求 参数 从 request 对象的 body 属性中获取elif request.method in ['POST','PUT','DELETE']:# 根据接口,POST/PUT/DELETE 请求的消息体都是 json格式request.params = json.loads(request.body)# 根据不同的action分派给不同的函数进行处理action = request.params['action']if action == 'list_customer':return listcustomers(request) #查看elif action == 'add_customer':return addcustomer(request) #新增elif action == 'modify_customer':return modifycustomer(request) #修改elif action == 'del_customer':return deletecustomer(request) #删除else:return JsonResponse({'ret': 1, 'msg': '不支持该类型http请求'})def listcustomers(request):return JsonResponse({'ret': 1, 'msg': '展现数据'})
def addcustomer(request):return JsonResponse({'ret': 1, 'msg': '添加数据'})
def modifycustomer(request):return JsonResponse({'ret': 1, 'msg': '修改数据'})
def deletecustomer(request):return JsonResponse({'ret': 1, 'msg': '删除数据'})
定义mgr下的子路由
vi Django_demo/mgr/urls.py
from django.urls import pathfrom .k8s import dispatcher
urlpatterns = [path('customers/', dispatcher), #定义路由
]
4、测试验证
http://127.0.0.1:8000/api/mgr/customers/?action=list_customer

二、列出数据
列出也就是查看,增删改查里面的查询,http 响应消息 body 中, 数据以json格式存储,下面是最开头的接口文档中常见的接口数据返回格式
{"ret": 0,"retlist": [{"ClusterName": "acp-r1-1","id": 1,"NodeSum": "100","PrometheusAddress": "192.168.1.1"},{"ClusterName": "123123","id": 4,"NodeSum": "123123","PrometheusAddress": "123123"}]
}
从上面格式中看出我们无需将数据库中获取的数据 转化为 供浏览器展示的HTML,在前后端分离中需要展示页面是前端的事情,我们只需要把数据提交上去即可
1、添加数据模型
vi Django_demo/mgr/models.py
#直接拷贝之前paas的
from django.db import modelsclass PaasInfo(models.Model):# 集群名称ClusterName = models.CharField(max_length=200)# node主机数量NodeSum = models.CharField(max_length=200)# prometheus地址PrometheusAddress = models.CharField(max_length=200)
2、修改列出数据函数
vi Django_demo/mgr/k8s.py
#先导入之前paas使用的模型,也就是链接paas用的数据库
from paas.models import PaasInfodef listcustomers(request):# 返回一个 QuerySet 对象 ,包含所有的表记录qs = PaasInfo.objects.values()# 将 QuerySet 对象 转化为 list 类型# 否则不能 被 转化为 JSON 字符串retlist = list(qs)return JsonResponse({'ret': 0, 'retlist': retlist})
3、访问测试
import requests,pprintresponse = requests.get('http://127.0.0.1:8000/api/mgr/customers/?action=list_customer')pprint.pprint(response.json())
返回
{"ret": 0,"retlist": [{"ClusterName": "acp-r1-1","NodeSum": "100","PrometheusAddress": "192.168.1.1","id": 1},{"ClusterName": "123123","NodeSum": "123123","PrometheusAddress": "123123","id": 2}]
}
三、添加数据
添加数据,也就是新增数据,传输数据格式如下
{"action":"add_customer","data":{"ClusterName":"X4-scp-1-1","NodeSum":"222","PrometheusAddress":"192.168.1.2"}
}
1、修改添加函数
vi Django_demo/mgr/k8s.py
def addcustomer(request):info = request.params['data']# 从请求消息中 获取要添加客户的信息# 并且插入到数据库中# 返回值 就是对应插入记录的对象record = PaasInfo.objects.create(ClusterName=info['ClusterName'] ,NodeSum=info['NodeSum'] ,address=info['PrometheusAddress'])return JsonResponse({'ret': 0, 'id':record.id})
2、关闭 Csrf
新创建的项目, Django 缺省会启用一个 CSRF (跨站请求伪造) 安全防护机制。
在这种情况下, 所有的Post、PUT 类型的 请求都必须在HTTP请求头中携带用于校验的数据
为了简单起见,我们先临时取消掉CSRF的 校验机制,等以后有需要再打开
vi Django_demo/Django_demo/settings.py
MIDDLEWARE = ['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware',#将下面这行注释掉# 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware',
]
3、测试
随便建一个新文件用于测试请求url
vi main.py
import requests,pprint# 构建添加 客户信息的 消息体,是json格式
payload = {"action":"add_customer","data":{"ClusterName":"abc","NodeSum":"133","PrometheusAddress":"192.168.1.2"}
}# 发送请求给web服务
response = requests.post('http://127.0.0.1:8000/api/mgr/customers/',json=payload)
pprint.pprint(response.json())
上面执行完毕后,可以在python上直接get 或者直接浏览器访问下面地址即可,下面有运行了两次所以会有两条相同的数据
http://127.0.0.1:8000/api/mgr/customers?action=list_customer

四、修改数据
1、请求格式
{"action":"modify_customer","id": 3,"newdata":{"ClusterName":"gfs-r3-1","NodeSum":"5000","PrometheusAddress":"192.168.1.21"}
}
2、添加修改函数
def modifycustomer(request):# 从请求消息中 获取修改客户的信息# 找到该客户,并且进行修改操作customerid = request.params['id']newdata = request.params['newdata']print(customerid,newdata)try:# 根据 id 从数据库中找到相应的客户记录customer = PaasInfo.objects.get(id=customerid)except PaasInfo.DoesNotExist:return {'ret': 1,'msg': f'id 为`{customerid}`的客户不存在'}#注意修改每个判断的3个变量if 'ClusterName' in newdata:customer.ClusterName = newdata['ClusterName']if 'NodeSum' in newdata:customer.NodeSum = newdata['NodeSum']if 'PrometheusAddress' in newdata:customer.PrometheusAddress = newdata['PrometheusAddress']# 注意,一定要执行save才能将修改信息保存到数据库customer.save()return JsonResponse({'ret': 0})
3、测试
vi main.py
import requests,pprint# 构建添加 客户信息的 消息体,是json格式
payload = {"action":"modify_customer","id": 3,"newdata":{"ClusterName":"gfs-r3-1","NodeSum":"5000","PrometheusAddress":"192.168.1.21"}
}# 发送请求给web服务
response = requests.post('http://127.0.0.1:8000/api/mgr/customers/',json=payload)
pprint.pprint(response.json())
忘截图了,上面是把id为3的值进行了修改
五、删除数据
1、数据格式
{"action":"del_customer","id": 6
}
2、添加删除函数
def deletecustomer(request):customerid = request.params['id']try:# 根据 id 从数据库中找到相应的客户记录customer = PaasInfo.objects.get(id=customerid)except PaasInfo.DoesNotExist:return {'ret': 1,'msg': f'id 为`{customerid}`的客户不存在'}# delete 方法就将该记录从数据库中删除了customer.delete()return JsonResponse({'ret': 0})
3、测试
vi main.py
import requests,pprint# 构建添加 客户信息的 消息体,是json格式
payload = {"action":"del_customer","id": 4
}# 发送请求给web服务
response = requests.post('http://127.0.0.1:8000/api/mgr/customers/',json=payload)
pprint.pprint(response.json())

相关文章:
Python 框架学习 Django篇 (四) 数据库增删改查(CURD)
在上一章结尾我们了解到如采用前后端开发分离的架构模式开发,后端几乎不负责任何展现界面的工作,只负责对数据进行管理 ,对数据的管理主要体现在: (增加、修改、删除、列出 )具体的接口参考大佬的文档BYSM…...
关于错误码
初学编程,在C语言中定义错误码,是使用宏: #define SUCCESS 0 //成功 #define FAILED 1 //失败 后来知道,用枚举更适合,因为宏的名声实在不好,而枚举可以帮你自动编号,减少…...
Linux | gcc/g++的使用
目录 前言 一、程序的翻译过程 1、预编译 2、编译 3、汇编 4、链接 (1)链接做了什么 (2)动态链接 (3)静态链接 (4)如何使用gcc进行动态链接和静态链接 前言 本章主要带着大…...
了解容器运行时安全:保护你的容器应用
前言 容器是一种虚拟化技术,用于封装和运行应用程序及其依赖项,以便在不同的计算环境中保持一致性和可移植性。自2013年容器诞生至今,容器Docker镜像的下载量超20亿,虽然容器行业发展如火如荼,但是其安全风险却不容乐…...
大规模语言LLaVA:多模态GPT-4智能助手,融合语言与视觉,满足用户复杂需求
大规模语言LLaVA:多模态GPT-4智能助手,融合语言与视觉,满足用户复杂需求 一个面向多模式GPT-4级别能力构建的助手。它结合了自然语言处理和计算机视觉,为用户提供了强大的多模式交互和理解。LLaVA旨在更深入地理解和处理语言和视…...
Element UI定义方法校验邮箱格式
1. .vue中定义了3个邮箱输入框,前面两个是输入多个邮件地址,最后一个是使用element自带的校验来校验单个邮件地址 <el-row><el-col :span"24"><el-form-item label"收件人" prop"to"><el-input v-mo…...
DigiCert代码签名证书
在当今的数字化时代,确保软件的完整性和来源的可靠性至关重要。DigiCert代码签名证书是一种专业而受信任的数字签名解决方案,帮助开发者保护其软件免受篡改和恶意行为的侵害。本文将介绍DigiCert代码签名证书的特点和优势,并讨论为何选择Digi…...
HTML5+CSS3小实例:网页底部间隔波浪动画特效
实例:网页底部间隔波浪动画特效 技术栈:HTML+CSS 效果: 源码: 【html】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" content…...
前端 js 之 代码执行的一个过程 02
嘿,欢迎你来 !💕 文章目录 前言一、运行一个 js 文件二、运行环境三、js执行代码的过程(普通变量)四、打印 window五、js执行代码的过程(函数变量)六、函数调用函数的过程注意!&…...
【经验分享】如何构建openGauss开发编译提交一体化环境
前文 本文适合对openGauss源代码有好奇心的爱好者,那么一个友好的openGauss源代码环境应该是怎么样的。openGauss的开发环境是如何设置的?openGauss的编译环境是如何构建的?如何向openGauss提交代码,笔者集合官方和几位博主实践提…...
儿童疫苗接种:安全与注意事项
引言: 儿童的疫苗接种是维护其健康和预防传染病的重要措施。疫苗可以有效地保护儿童免受各种疾病的威胁,但在接种过程中需要家长和监护人特别关注一些注意事项,以确保接种的安全性和有效性。本文将深入探讨儿童疫苗接种的重要性,…...
Go 代码块与作用域,变量遮蔽问题详解
Go 代码块与作用域详解 文章目录 Go 代码块与作用域详解一、引入二、代码块 (Block)2.1 代码块介绍2.2 显式代码块2.3 隐式代码块2.4 空代码块2.5 支持嵌套代码块 三、作用域 (Scope)3.1 作用域介绍3.2 作用域划定原则3.3 标识符的作用域范围3.3.1 预定义标识符作用域3.3.2 包代…...
可观测性-Metrics-WebClient异步Http远程Call
代码示例 1.依赖导入 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><ar…...
Android之播放本地视频和Url视频方法
一、播放本地视频文件 根据文件路径在浏览器中播放,可用于视频预览等场景 效果: 用浏览器播放本地视频 文件路径例子: /storage/emulated/0/Android/data/com.custom.jfrb/files/Movies/1697687179497.mp4 File file new File("文件…...
设计模式:工厂方法模式(C#、JAVA、JavaScript、C++、Python、Go、PHP):
本节主要介绍设计模式中的工厂方法模式。 简介: 工厂方法模式,它是对简单工厂模式的进一步抽象化,其好处是可以使系统在不修改原来代码的情况下引进新的产品,即满足开闭原则。 它定义了一个用于创建对象的工厂接口,让…...
C++基础——指针
1 概述 指针的作用:可以通过指针间接访问内存 内存编号从0开始,一般使用十六进制数字表示,指针可以保存地址 2 指针变量定义和作用 int main() {//1、指针的定义int a 10; //定义整型变量a//指针定义语法: 数据类型 * 变量名 …...
PLC 学习day02 硬件输入/输入的知识
1.资料来源 1.链接:三菱PLC视频教程全集之FX3U基本单元输入接线_哔哩哔哩_bilibili 2. 链接: 三菱plc视频教程全集之FX3U基本单元输出接线_哔哩哔哩_bilibili 2. PLC 的输入部分器件连接。 2.1 PLC输入部分的硬件知识 1. 一般输入部分是PLC获取信息的地…...
rabbitMq (2)
RabbitMQ 消息应答与发布 文章目录 1. 消息应答1.2 自动应答1.2 手动应答1.3 代码案例 2. RabbitMQ 持久化2.1 队列持久化2.2 消息持久化 3. 不公平分发4. 预取值分发5. 发布确认5.1 发布确认逻辑5.2 开启发布确认的方法5.3 单个确认发布5.4 批量确认发布5.5 异步确认5.5.1 处理…...
通讯协议学习之路:RS422协议理论
通讯协议之路主要分为两部分,第一部分从理论上面讲解各类协议的通讯原理以及通讯格式,第二部分从具体运用上讲解各类通讯协议的具体应用方法。 后续文章会同时发表在个人博客(jason1016.club)、CSDN;视频会发布在bilibili(UID:399951374) 一、…...
剪映failed to initialize,cuda.is_available()为false解决
debug记录帖 错误1:打开剪映发现弹窗提示failed to initialize graphics backed for D3D11 错误2:torch版本、cuda版本(之前的正常环境)都对但是torch.cuda.is_available()为false 怀疑是显卡驱动的问题 打开Nvidia Geforce Exp…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...
基于单片机的宠物屋智能系统设计与实现(论文+源码)
本设计基于单片机的宠物屋智能系统核心是实现对宠物生活环境及状态的智能管理。系统以单片机为中枢,连接红外测温传感器,可实时精准捕捉宠物体温变化,以便及时发现健康异常;水位检测传感器时刻监测饮用水余量,防止宠物…...
ArcGIS Pro+ArcGIS给你的地图加上北回归线!
今天来看ArcGIS Pro和ArcGIS中如何给制作的中国地图或者其他大范围地图加上北回归线。 我们将在ArcGIS Pro和ArcGIS中一同介绍。 1 ArcGIS Pro中设置北回归线 1、在ArcGIS Pro中初步设置好经纬格网等,设置经线、纬线都以10间隔显示。 2、需要插入背会归线…...
