Python 框架学习 Django篇 (四) 数据库增删改查(CURD)

news2024/11/17 13:41:50

       在上一章结尾我们了解到如采用前后端开发分离的架构模式开发,后端几乎不负责任何展现界面的工作,只负责对数据进行管理 ,对数据的管理主要体现在:  (增加、修改、删除、列出 具体的接口参考大佬的文档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 json

from django.http import JsonResponse
from django.shortcuts import render

def 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 path

from .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 models

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

def listcustomers(request):
    # 返回一个 QuerySet 对象 ,包含所有的表记录
    qs = PaasInfo.objects.values()

    # 将 QuerySet 对象 转化为 list 类型
    # 否则不能 被 转化为 JSON 字符串
    retlist = list(qs)

    return JsonResponse({'ret': 0, 'retlist': retlist})

3、访问测试

import  requests,pprint

response = 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())



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

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

相关文章

插入排序改进 将交换变成赋值语句 优点适用于近乎有序的序列

效果非常的明显 下面给出代码截图 再给出原代码 #include<iostream> #include<string> #include "Student.h" #include "sorttesthelper.h" using namespace std;template<typename T >void selectionSort( T arr[], int n){for(int i…

MATLAB——Decision Tress决策树程序

给个关注呦&#xff01;欢迎关注微♥公众号“电击小子程高兴的MATLAB小屋”&#xff0c;海量资源等你来呦&#xff01; 光储直流微电网MATLAB/Simulink仿真 光伏PV三相并网逆变器 %% I. 清空环境变量 clear all clc warning off %% II. 导入数据 第一列是序号 第二…

让你至少拿2份offer的软件测试面试题来了(100题带标准答案)

一、自我介绍 二、灵活问题 1、大概说说之前公司的测试流程 2、测试报告有哪些内容? 3、如何保证用例的覆盖度&#xff1f; 4、什么是测试用例&#xff0c;什么是测试脚本&#xff1f;两者的关系 5、Bug的级别&#xff0c;按照什么划分 6、你认为是bug&#xff0c;开发认…

微信小程序开发的OA会议之会议,投票,个人中心的页面搭建及模板,还有自定义组件的学习

目录 一、自定义组件 1. 创建 2. 定义 3. 编写 4. 使用 二、会议 1. 数据 2. 显示 3. 样式 三、个人中心 1. 页面 2. 样式 四、投票 1. 引用 2. 数据 3. 页面 4. 样式 每篇收获 一、自定义组件 开发者可以将页面内的功能模块抽象成自定义组件&#xff0c;以…

国外访问学者面签技巧

当涉及国外访问学者的面签时&#xff0c;提前准备和掌握一些技巧可以大大增加成功的机会。本文知识人网小编将为您介绍一些关键的面签技巧&#xff0c;帮助您在国外访问学者面签中表现出色。 1.详细准备材料&#xff1a;在面签前&#xff0c;确保您已经准备好所有所需的文件和材…

乙酰基四肽-3/Acetyl Tetrapeptide-3——刺激毛囊,长出新头发,有效防止秃头

社会对头发很着迷。从圣经人物参孙&#xff08;他从头发中获得力量&#xff0c;并说如果剃光头他就会失去力量&#xff09;&#xff0c;到社交媒体上无休无止地谈论名人的标志性风格&#xff0c;头发是一个永恒的话题。 为什么痴迷&#xff1f;好吧&#xff0c;我们的头发是外…

分布式事务及CAP和BASE顶底

一、分布式事务 单体应用肯定就不存在分布式事务了&#xff0c;只有在分布式微服务系统中&#xff0c;各个服务之间通过RPC调用后&#xff0c;每个微服务有自己和数据库的连接&#xff0c;各个微服务的回滚不影响其他的微服务事务&#xff0c;这几必须使用分布式事务来解决分布…

2022年京东双十一家用电器全品类数据回顾

2023年双十一临近&#xff0c;特此带大家回顾一下去年双十一热门品类的一些战况数据。 由于涉及到热门细分品类众多&#xff0c;会分为多篇内容。 本篇先从京东家用电器品类说起。 2022年双11期间&#xff0c;京东家用电器累计销量2960万件&#xff0c;累计销售额约280亿元&…

2023下半年软考考试方式、考试时间和批次安排!(附加模拟系统绘图操作说明)

注意了下半年考试的伙伴们&#xff01;官方发了通告了&#xff01; 按照《2023年下半年计算机技术与软件专业技术资格&#xff08;水平&#xff09;考试有关工作调整的通告》&#xff0c;自2023年下半年起&#xff0c;计算机软件资格考试方式均由纸笔考试改革为计算机化考试。 …

便携式电源,移动电源,电源组,便携式汽车应急启动电源的适用范围是什么?合规标准是什么?如何办理?

便携式电源&#xff0c;移动电源&#xff0c;电源组&#xff0c;便携式汽车应急启动电源的适用范围是什么&#xff1f;合规标准是什么&#xff1f;如何办理&#xff1f; 一、亚马逊的便携式电源&#xff0c;移动电源&#xff0c;电源组&#xff0c;便携式汽车应急启动电源的适…

海思Hi3519DV500边缘计算盒子-英码IVP09A,双核A55 64位处理器

产品简介 IVP09A是英码科技推出的边缘计算智能工作站&#xff0c;搭载双核 Cortex-A55 架构AI 处理器&#xff1b;内置高效的神经网络推理引擎&#xff0c;提供2.5TopsNPU算力;支持多路视频图像识别硬件加速。IVP09A&#xff0c;高效能低成本、稳定易开发、多点布线、联网管控…

FPGA驱动SDRAM

文章目录 一.SDRAM简介&#xff08;手册分析&#xff09;1.1存储空间1.2特征1.3引脚1.4内部结构1.5需要关注的一些时间1.6模式寄存器1.7命令真值表 二.时序分析&#xff08;手册分析&#xff09;2.1Avalon时序2.2行激活时序2.3列读写时序2.4读数据2.5写数据 三.初步设计3.1状态…

冒泡排序给cpu干懵了 哈哈 还有希尔排序 算法补充(学习笔记)

直接给出代码 #include<iostream> #include<string> #include "Student.h" #include "sorttesthelper.h" #include "BubbleSort.h" using namespace std;template<typename T> void shellSort(T arr[], int n){// 计算 incr…

Nginx+keepalived 高可用双机热备—双主模式

双机高可用方法目前分为两种&#xff1a; 1&#xff09;Nginxkeepalived 双机主从模式&#xff1a;即前端使用两台服务器&#xff0c;一台主服务器和一台热备服务器&#xff0c;正常情况下&#xff0c;主服务器绑定一个公网虚拟IP&#xff0c;提供负载均衡服务&#xff0c;热备…

什么是客户端?一文了解客户端定义、特点与功能、搭建方法

客户端&#xff1a;定义、特点与功能、搭建方法 1. 定义&#xff1a; 客户端是计算机网络中的一个术语&#xff0c;指的是在网络通信中充当主动发起请求并接收服务响应的一方。通常&#xff0c;客户端是指运行在终端设备上的软件或硬件实体&#xff0c;通过与服务器进行通信来…

从实体经济和数字经济融合展开,思考商业模式的变化

对于《关于构建数据基础制度更好发挥数据要素作用的意见》想必大家已经不陌生了&#xff0c;之前的文章中也围绕数据要素说了很多东西&#xff0c;数据、数字化、数字经济之类的已经称得上是绝大部分人对未来发展方向的共识&#xff0c;不过今天想从这个《意见》出发&#xff0…

电脑开不了机用U盘重装系统Win10教程

如果我们遇到了电脑开不起机的问题&#xff0c;这给我们的正常使用带来了很大的影响。这时候我们可以借助U盘重装系统的方法&#xff0c;轻松应对这一问题。下面小编给大家详细介绍关于用U盘给开不机的电脑重装Win10系统的教程步骤&#xff0c;操作后用户就能正常使用电脑了。 …

Mac 远程桌面软件

对于使用 Mac 计算机和笔记本电脑的企业来说&#xff0c;适用于 Mac 的远程桌面软件变得越来越重要&#xff0c;随着远程工作变得越来越普遍&#xff0c;IT 管理员和组织需要一种安全的方式来访问和修复问题、处理紧急任务以及监控远程工作站的状态&#xff0c;为了促进远距离协…

结构体和联合体详解

结构体和联合体详解 1.结构体struct1.1 结构体struct的设计1.2 结构体struct变量的定义和初始化举例&#xff1a;使用结构体Student定义并初始化stu1变量。举例&#xff1a;结构体嵌套的初始化方法。 1.3 结构体struct成员变量的访问&#xff08;获取与赋值&#xff09;1.3.1 使…

科研宝典·工具篇 | CiteSpace: 科学文献分析

​文献计量学是指用数学和统计学的方法&#xff0c;定量地分析一切知识载体的交叉科学。它是集数学、统计学、文献学为一体&#xff0c;注重量化的综合性知识体系。特别是&#xff0c;信息可视化技术手段和方法的运用&#xff0c;可直观的展示主题的研究发展历程、研究现状、研…