用APIView和VIew编写5个接口
用APIView和VIew编写5个接口
【一】使用View格式提交form-data数据
【一】创建表
- models.py
class Book(models.Model):
name = models.CharField(max_length=50)
price = models.DecimalField(max_digits=5, decimal_places=2)
class Meta:
db_table = 'book2'
【二】后端
from urllib.parse import unquote
from django.http import JsonResponse
from django.shortcuts import render
from django.views import View
from normal.models import Book
# Create your views here.
class BookView(View):
def get(self, request):
obj_list = Book.objects.all()
l = []
for i in obj_list:
l.append({"name": i.name, "price": i.price})
return JsonResponse({'code': 100, 'msg': "查询成功", 'results': l})
# 增加
def post(self, request):
# urlencode和form-data格式
data = request.POST
Book.objects.create(name=data.get('name'), price=data.get('price'))
return JsonResponse({'code': 100, 'msg': "新增成功", })
class BookDetailView(View):
def get(self, request, pk):
obj = Book.objects.filter(pk=int(pk)).first()
return JsonResponse({'code': 100, 'msg': "查询成功", 'results': {'name': obj.name, 'price': obj.price}})
# 修改
def put(self, request, pk):
# request.body bytes格式转换成字符串
data = request.body.decode('utf-8')
print(data)
book_list=data.split('&') # 拿到一个列表
dic = {}
for item in book_list:
# 转码只给value转
dic[item.split('=')[0]] = unquote(item.split('=')[1])
print(dic)
Book.objects.filter(pk=int(pk)).update(**dic)
return JsonResponse({'code': 100, 'msg': "修改成功"})
def delete(self, request, pk):
obj = Book.objects.filter(pk=int(pk)).delete()
return JsonResponse({'code': 100, 'msg': "删除成功"})
【三】配置路由
from django.urls import path, include
from normal.views import *
urlpatterns = [
path('books/', BookView.as_view()),
path('books/<int:pk>', BookDetailView.as_view())
]
【四】使用Apifox测试
【1】新增数据
![image-20240411162016311](https://img2023.cnblogs.com/blog/3331555/202404/3331555-20240411162505465-492705116.png)
【二】查询所有
![image-20240411162502246](https://img2023.cnblogs.com/blog/3331555/202404/3331555-20240411162504307-474576181.png)
【三】查询单个
![image-20240411163037136](https://img2023.cnblogs.com/blog/3331555/202404/3331555-20240411163043093-589378682.png)
【四】删除
![image-20240411163155099](https://img2023.cnblogs.com/blog/3331555/202404/3331555-20240411163159584-2097669739.png)
【五】修改
- put请求提交数据 django框架导致request.POST里面取不出值
【二】使用View格式提交json-data数据
import json
from django.http import JsonResponse
from django.shortcuts import render
from django.views import View
from book.models import Book
# Create your views here.
class TaskView(View):
def get(self, request):
book_list = Book.objects.all()
l = []
for book in book_list:
l.append({"name": book.name, "price": book.price})
return JsonResponse({"code": 100, "message": '查询成功', "results": l})
def post(self, request):
data = json.loads(request.body)
book = Book.objects.create(**data)
return JsonResponse({"code": 100, "message": '添加成功',
"results": {"name": book.name, "price": book.price}})
class TaskDetailView(View):
# 查询单个
def get(self, request, id):
book = Book.objects.get(id=int(id))
return JsonResponse({"code": 100, "message": '查询单个成功',
"results": {"name": book.name, "price": book.price}})
# 修改
def put(self, request, id):
data = json.loads(request.body)
print(data)
book_update = Book.objects.filter(id=int(id)).update(**data)
return JsonResponse({"code": 100, "message": '修改数据成功'}
)
# 删除
def delete(self, request, id):
Book.objects.filter(id=int(id)).delete()
return JsonResponse({"code": 100, "message": '删除数据成功'})
【三】使用API格式提交form-data数据
- 前端无论什么编码格式,传过来的数据都会被解析到request.data中,是个字典
from urllib.parse import unquote
from django.http import JsonResponse
from django.shortcuts import render
from django.views import View
from rest_framework.views import APIView
from normal.models import Book
class BookView(APIView):
def get(self, request):
obj_list = Book.objects.all()
l = []
for i in obj_list:
l.append({"name": i.name, "price": i.price})
return JsonResponse({'code': 100, 'msg': "查询成功", 'results': l})
# 增加
def post(self, request):
# urlencode和form-data格式
Book.objects.create(name=request.data.get('name'), price=request.data.get('price'))
return JsonResponse({'code': 100, 'msg': "新增成功", })
class BookDetailView(APIView):
def get(self, request, pk):
obj = Book.objects.filter(pk=int(pk)).first()
return JsonResponse({'code': 100, 'msg': "查询成功", 'results': {'name': obj.name, 'price': obj.price}})
# 修改
def put(self, request, pk):
Book.objects.filter(pk=pk).update(name=request.data.get('name'), price=request.data.get('price'))
return JsonResponse({'code': 100, 'msg': "修改成功"})
def delete(self, request, pk):
obj = Book.objects.filter(pk=int(pk)).delete()
return JsonResponse({'code': 100, 'msg': "删除成功"})
【四】使用API格式提交JSON数据
# 新增数据,有个坑
''' APIView帮咱们---》看POST中有没有数据,如果有,直接赋值给data,如果没有,他去body中转成字典再给data
json格式:
POST没有东西 QueryDict
data有数据 dict
urlencoded或form-data
POST有东西 QueryDict
data有数据 QueryDict
'''
from urllib.parse import unquote
from django.http import JsonResponse
from django.shortcuts import render
from django.views import View
from rest_framework.views import APIView
from normal.models import Book
class BookView(APIView):
def get(self, request):
obj_list = Book.objects.all()
l = []
for i in obj_list:
l.append({"name": i.name, "price": i.price})
return JsonResponse({'code': 100, 'msg': "查询成功", 'results': l})
# 增加
def post(self, request):
# urlencode和form-data格式
Book.objects.create(**request.data)
return JsonResponse({'code': 100, 'msg': "新增成功", })
class BookDetailView(APIView):
def get(self, request, pk):
obj = Book.objects.filter(pk=int(pk)).first()
return JsonResponse({'code': 100, 'msg': "查询成功", 'results': {'name': obj.name, 'price': obj.price}})
# 修改
def put(self, request, pk):
Book.objects.filter(pk=pk).update(**request.data)
return JsonResponse({'code': 100, 'msg': "修改成功"})
def delete(self, request, pk):
obj = Book.objects.filter(pk=int(pk)).delete()
return JsonResponse({'code': 100, 'msg': "删除成功"})
-
执行流程总结:
- 只要继承了APIView,就没有csrf限制了
- 只要继承了APIView,request就是新的request了,它有data
- 在执行跟请求方式同名的方法之前,执行了三大认证:认证,频率,权限
- 只要在三大认证或者视图类的方法中出了一场,都会被捕获,统一处理