我们在学APIView之前,先做一个小练习:创建一个图书表,里面含有书名,价格及出版社名称,然后做出它的增删改查开放接口再用postman进行操作。
首先创建Books表:
然后创建路由,开放接口,做出它的增删改查。
app01路由:
admin路由:
然后创建视图:
from django.http import JsonResponse
# Create your views here.
from django.views import View
from .models import Book
class BookView(View):
def get(self, request):
obj_list = Book.objects.all()
l = []
for obj in obj_list:
l.append({'name': obj.name, 'price': obj.price, 'publish': obj.publish})
return JsonResponse({'code': 100, 'msg': '查询成功', 'results': l})
def post(self, request):
data = request.POST
Book.objects.create(name=data.get('name'), price=data.get('price'), publish=data.get('publish'))
return JsonResponse({'code':100, 'msg':'新增成功'})
from urllib.parse import unquote
class BookDetailView(View):
def get(self, request, pk):
obj = Book.objects.filter(pk=pk).get()
return JsonResponse({'code':100, 'msg':'查询成功', 'results':{'name':obj.name, 'price':obj.price, 'publish':obj.publish}})
def delete(self, request, pk):
Book.objects.filter(pk=pk).delete()
return JsonResponse({'code':100, 'msg':'删除成功'})
def put(self, request, pk):
body_str = request.body.decode('utf-8')
body_list = body_str.split('&')
dic = {}
for item in body_list:
dic[item.split('=')[0]] = unquote(item.split('=')[1])
Book.objects.filter(pk=pk).update(**dic)
return JsonResponse({'code':100, 'msg':'修改成功'})
这样,关于这个表的增删改查就做好了。
增:
删:
改:
查其一:
查所有:
APIView
当我们写完上述代码后,我们遇到两个问题:
- 前端body体中的数据,有时候能用request.POST取出来,有时候取不出来
- csrf 问题,必须注释掉相关中间件
当我们通过继承APIView之后,我们就可以避免掉上面的问题了。
APIView是drf提供的视图类。
APIView就是在原有继承view类/函数里,将view换成APIView.
总结:
- 只要继承了APIView,就不需要处理csrf.
- 以后前端提交的数据,无论什么编码或者请求方式,数据都从request.data中取
- 只要继承了APIView,request就是新的reqest了,它有新的data
- 在执行跟请求方式同名的方法前,执行了三大认证:认证(是否登录),频率(是否太快),权限(是否符合权限)。
- 只要在三大认证或者视图类的方法中出了异常都会被捕获,统一处理。
Request对象
根据上面APIView的总结提到,我们继承了APIView之后,request就不是以前的request了,但是旧的request的所有操作新的都可以用。
但是毕竟是新的request,它还多了一些方法:
- request.data --> 请求体的数据
- request.query_params --> 原来的request。GET
- request._request --> 老的request方法
如何用:
from rest_framework.requset import Request