需求
实现数据库的增删改查接口:
接口类型 | url | 接口详情 |
---|---|---|
GET | /projects/ | 获取项目列表数据(json数组形式返回) |
POST | /projects/ | 创建一条项目数据(以json形式传递参数,同时需要将创建成功 |
GET | /projects/int:pk/ | 获取一条项目详情数据(json对象形式返回) |
PUT | /projects/int:pk/ | 更新一条项目数据(以json形式传递参数,同时需要将更新成功之后的数据以json形式返回) |
DELETE | /projects/int:pk/ | 删除一条项目数据(返回删除成功json数据) |
代码实现
projects/views.py
import json
from django.http import JsonResponse
from django.views import View
from projects.models import Projects
err_msg = {
"status": False,
"msg": "参数有误",
"num": 0
}
class ProjectView(View):
def get(self, request):
"""
获取项目列表数据
:return: 返回获取项目列表数据
"""
# 1.获取全部数据
qs = Projects.objects.all()
# 2.获取到的数据转化为json数据
projects_list = []
obj: Projects
for obj in qs:
projects_list.append({
'id': obj.id,
'name': obj.name,
'leader': obj.leader
})
# 3.将json数据返回
return JsonResponse(projects_list, safe=False, json_dumps_params={"ensure_ascii": False})
def post(self, request):
"""
创建一条项目数据(以json形式传递参数)
:return: 将创建成功之后的数据以json形式返回
"""
# 1.获取前端传来的json数据
try:
json_dict = json.loads(request.body.decode('utf-8'))
except Exception:
return JsonResponse(err_msg, json_dumps_params={"ensure_ascii": False}, status=400)
# 2.对数据进行校验
if 'name' not in json_dict or len(json_dict['name']) > 20 or len(json_dict['leader']) > 10:
return JsonResponse(err_msg, json_dumps_params={"ensure_ascii": False}, status=400)
# 3.保存数据
qs = Projects.objects.create(**json_dict)
return JsonResponse(json_dict, safe=False, json_dumps_params={"ensure_ascii": False})
class ProjectParameterView(View):
def get(self, request, pk):
"""
获取一条项目详情数据
:param pk: 项目id
:return: 返回获取到的项目详情数据
"""
# 1.获取数据
try:
data = Projects.objects.get(id=pk)
except Exception:
return JsonResponse(err_msg, json_dumps_params={"ensure_ascii": False}, status=400)
# 2.将数据转为json格式
json_dict = []
json_dict.append({
'id': data.id,
'name': data.name,
'leader': data.leader
})
# 3.将数据返回前端
return JsonResponse(json_dict, safe=False, json_dumps_params={"ensure_ascii": False})
def put(self, request, pk):
"""
更新一条项目数据(以json形式传递参数)
:param pk: 项目id
:return: 将更新成功之后的数据以json形式返回
"""
# 1.获取数据
data = Projects.objects.filter(id=pk)
if len(data) == 0:
return JsonResponse(err_msg, json_dumps_params={"ensure_ascii": False}, status=400)
# 2.读取前端传来的json数据
json_dict = json.loads(request.body.decode('utf-8'))
# 3.更新数据
data.update(**json_dict)
return JsonResponse(json_dict, safe=False, json_dumps_params={"ensure_ascii": False})
def delete(self, request, pk):
"""
删除一条项目数据
:param pk: 项目id
:return: 返回删除成功json数据
"""
# 1.获取数据
try:
data = Projects.objects.get(id=pk)
except Exception:
return JsonResponse(err_msg, json_dumps_params={"ensure_ascii": False}, status=400)
# 2.将数据转为json格式
json_dict = []
json_dict.append({
'id': data.id,
'name': data.name,
'leader': data.leader
})
# 3.删除数据
data.delete()
return JsonResponse(json_dict, safe=False, json_dumps_params={"ensure_ascii": False})
痛点分析
-
代码冗余严重,不够简洁
-
数据校验极为麻烦(if嵌套层级非常多),且复用性比较差
-
编码没有统一的规范,代码维护性差
-
获取列表数据时,有很多缺失的功能
a.没有提供分页功能
b.没有提供过滤功能
c.没有提供排序功能 -
整个接口,也有功能缺失
a.没有提供认证授权功能
b.没有提供限流功能(反爬虫)
c.传递参数的形式单一,不支持表单传参
d.5个接口处于不同的类视图中