91 rest风格 restful规范 restframework
-1 : rest规范
0: 它是基于Django的,帮助我们快速开发符合RESTful规范的接口框架:对rest-framework框架的认识:https://www.cnblogs.com/GGGG-XXXX/articles/9260702.html
1 :使用restframework的cbv的流程:https://blog.csdn.net/NightCharm/article/details/80405479(restful架构)
https://www.cnblogs.com/GGGG-XXXX/articles/9675911.html(老师博客)
1 继承APIview: from rest_framework.views import APIView
2 先走自己类的as_view方法, 没有走父类APIview的as_view方法, APIview中有as_view方法, 返回csrf_exempt(view), --view = super(APIView, cls).as_view(**initkwargs)
3 执行父类的as_view方法, 返回view函数, 执行view函数, 返回self.dispatch
4 从自己类中找dispatch,没有, 找父类的dispatch方法, 有,执行, request = self.initialize_request(request, *args, **kwargs), 获取到新的request, 进到 initialize_reques放回一个Request类, 旧的request放在_request里.然后走try: 执行相应的get或者post方法.
2 : APIview和View的区别:
1 APIview重写了as_view和dispatch方法
2 在dispatch中重新封装了request, :
新的request: Request()
旧的request: _request
3 get请求的数据:
request.query_params, 在Request类中可以看到(源码)
4 post请求的数据:
request.data
3 : django的序列化:
第一版: 用values以及JsonResponse实现:
注意:
1: 使用json.dumps时加上ensure_ascil不会出现乱码
res = json.dumps(ret, ensure_ascii=False)
2: 使用JsonResponse可以序列化时间类型, 如果不是字典, 加上safe= false
return HttpResponse(JsonResponse(ret, safe=False, json_dumps_params={"ensure_ascii": False}))
3: dumps和JsonResponse的区别: dumps继承jsonencode, jsonresponse继承encode类,自定义了一个default类, 可以处理时间类型.
第二版: 用django的serializes实现的序列化:
缺点: 不能序列化外键关系, 其次, 表名也会渲染到页面上, 不太好
第三版: 使用restframework: restframwork专门处理序列化的组件:serializers组件, 类比于model.
1 先建一个包, 并注册app
2 下载rest_framework: pip3 install djangorestframework 并在setting中注册.
3 创建路由, 走视图函数, 对queryset数据序列化, 借助序列化器, 在包下面创建serializers.py文件,
4 在py文件中写法:
from rest_framework import serializers class PublisherSerializer(serializers.Serializer): id = serializers.IntegerField() title = serializers.CharField(max_length=32) class AuthorSerializer(serializers.Serializer): id = serializers.IntegerField() name = serializers.CharField(max_length=32) class BookSerializer(serializers.Serializer): id = serializers.IntegerField() title = serializers.CharField(max_length=32) pub_time = serializers.DateField() category = serializers.CharField(source='get_category_display') publisher = PublisherSerializer() authors = AuthorSerializer(many=True)
5 在views的使用, 向声明序列化器,使用序列化器序列化queryset, 把模型对象放入序列化器进行字段匹配,
匹配上的字段进行序列化, 匹配不上的舍弃. 序列化好的数据放在ser_obj.data中,
from django.shortcuts import render,HttpResponsefrom rest_framework.response import Response #引入Response from rest_framework.views import APIView #引入 APIView from rest_framework import serializers #用rest_framework自己的serializers from django.views import View from api_demo.models import * class Bookserializers(serializers.Serializer): title=serializers.CharField(max_length=32) price=serializers.IntegerField() class BookView(APIView):#注意这里使用的是APIView不是View def get(self,request,*args,**kwargs): booklist=Book.objects.all() temp=Bookserializers(booklist,many=True)#如果传入的是多个值,由于queryset是多个对象的集合,many=True,默认False print(">>>>",temp) print("-------",temp.data) #得到的是一种orderDict数据类型的数据 return Response(temp.data) #必须要用Response发送,发送其中的data就可以