一、添加应用、路由分发、api规划
1、创建 mgr应用目录
python manage.py startapp mgr
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
二、列出数据
{
"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
四、修改数据
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())
六、简单实现登录逻辑
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}