一、添加应用、路由分发、api规划

1、创建 mgr应用目录

python manage.py startapp mgr 

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

2、添加处理请求模块 和 url 路由

接口文档案例

GET  /api/mgr/customers?action=list_customer  HTTP/1.1

#请求参数
http 请求消息 url 中 需要携带如下参数是action 填写的值为list_customer
通过接口文档可以看到对资源的增删改查操作都是同一个URL(/api/mgr/customers)
而不同的请求操作,使用了不同的方法 GET  POST PUT DELETE  

3、路由分发函数

path('customers/', 'app.views.list_customer', method='get'),
path('customers/', 'app.views.add_customer',  method='post'),

 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函数

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

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

二、列出数据

{
    "ret": 0,
    "retlist": [
        {
            "ClusterName": "acp-r1-1",
            "id": 1,
            "NodeSum": "100",
            "PrometheusAddress": "192.168.1.1"
        },
        
        {
            "ClusterName": "123123",
            "id": 4,
            "NodeSum": "123123",
            "PrometheusAddress": "123123"
        }
    ]              
}

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

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、测试

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

http://127.0.0.1:8000/api/mgr/customers?action=list_customer

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

四、修改数据

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

五、删除数据

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)-LMLPHP

六、简单实现登录逻辑

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

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

1、处理用户登录、登出请求

vi Django_demo/mgr/sign_in_out.py

from django.http import JsonResponse

from django.contrib.auth import authenticate, login, logout

# 登录处理
def signin( request):
    # 从 HTTP POST 请求中获取用户名、密码参数
    userName = request.POST.get('username')
    passWord = request.POST.get('password')

    # 使用 Django auth 库里面的 方法校验用户名、密码
    user = authenticate(username=userName, password=passWord)
    
    # 如果能找到用户,并且密码正确
    if user is not None:
        if user.is_active:
            if user.is_superuser:
                login(request, user)
                # 在session中存入用户类型
                request.session['usertype'] = 'mgr'

                return JsonResponse({'ret': 0})
            else:
                return JsonResponse({'ret': 1, 'msg': '请使用管理员账户登录'})
        else:
            return JsonResponse({'ret': 0, 'msg': '用户已经被禁用'})
        
    # 否则就是用户名、密码有误
    else:
        return JsonResponse({'ret': 1, 'msg': '用户名或者密码错误'})


# 登出处理
def signout( request):
    # 使用登出方法
    logout(request)
    return JsonResponse({'ret': 0})

 2、添加路由

vi Django_demo/mgr/urls.py

from django.urls import path

from .k8s import dispatcher
from .sign_in_out import signin,signout
urlpatterns = [
    path('customers/', dispatcher),


    #添加登录、登出路由
    path('signin', signin),
    path('signout', signout),
]

3、测试

vi main.py

import  requests,pprint

#这个账户密码是之前设置create直接拿来用
payload = {
    'username': 'root',
    'password': '12345678'
}

response = requests.post('http://127.0.0.1:8000/api/mgr/signin',data=payload)

pprint.pprint(response.json())

返回

#只有0是正确的,其他的非0都会返回msg的提升信息
{'ret': 0}
10-21 05:53