概述
FBV和CBV的概念
FBV 基于函数处理视图
CBV 基于对象处理视图
CBV的优点
1 提高代码的复用性,可以使用面向对象的技术,比如Mixin(多继承)
2 可以用不同的函数针对不同的HTTP方法处理,而不是通过多if判断,提高代码的可读性
restful协议
一切皆是资源,操作只是请求方式
- REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移”;
- REST从资源的角度类审视整个网络,它将分布在网络中某个节点的资源通过URL进行标识,客户端应用通过URL来获取资源的表征,获得这些表征致使这些应用转变状态;
- 对于所有的数据,不论是通过网络获取的的数据,还是操作(增删改查)的数据,都是资源,将一切数据视为资源是REST区别与其他架构风格的最本质属性;
- 对于REST这种面向资源的架构风格,有人提出一种全新的结构理念,即:面向资源架构(ROA:Resource Oriented Architecture)
restframework
Django REST框架是一个功能强大且灵活的工具包,用于构建Web API。
安装restframework
cmd --> pip install djangorestframework
序列化的三种方式
方式一
自己手动序列化
publish_list = list(Publish.objects.all().values("name", "email")) return HTTPResponse(json.dumps(publish_list))
方式二
自己动手序列化
publish_list = Publish.objects.all() temp = [] for obj in publish_list: temp.append({ "name": obj.name, "email": obj.email, }) return HTTPResponse(json.dumps(temp))
通过模块序列化
from django.forms.models import model_to_dict publish_list = Publish.objects.all() temp = [] for obj in publish_list: temp.append(model_to_dict(obj)) return HTTPResponse(json.dumps(temp))
方式三
Django的序列化
from django.core import serializers publish_list = Publish.objects.all() ret = serializers.serialize("json", publish_list) # json是格式,publish_list是要序列化的queryset return HTTPResponse(ret)
restframework的序列化
基于serializers模块的序列化方式
from rest_framework.response import Response from rest_framework import serializers class PublisherSerializers(serializers.Serializer): # 为queryset对象和model对象做序列化 name = serializers.CharField() email = serializers.CharField() class BookSerializers(serializers.Serializer): title = serializers.CharField(max_length=32) price = serializers.IntegerField() pub_date = serializers.DateField() publish = serializers.CharField(source="publish.name") # 一对多的序列化方式 # authors = serializers.CharField(source="authors.all") # 多对多的序列化方式 authors = serializers.SerializerMethodField() # 多对多的序列化方式(推荐,需要重写钩子函数) def get_authors(self, obj): """钩子函数""" temp = [] for obj in obj.authors.all(): temp.append(obj.name) return temp class PublishView(APIView): def get(self, request): publish_list = Publish.objects.all() ps = PublisherModerSerializers(publish_list, many=True) # queryset对象需要传many=True(model_obj对象不用传) return Response(ps.data) def post(self, request): print("post") print(request.data) return HttpResponse("ok")
基于ModelSerializer组件的序列化方式
class BookModelSerializer(serializers.ModelSerializer): class Meta: model = Book fields = "__all__" # Hyperlinked 超链接API publish = serializers.HyperlinkedIdentityField( view_name="publish_detail", # url别名 lookup_field="publish_id", # 循环中的字段 lookup_url_kwarg="id", # 分组名 ) class BookView(APIView): # 解析器 # parser_classes = [JSONParser, ] def get(self, request): book_list = Book.objects.all() bs = BookModelSerializer(book_list, many=True, context={'request': request}) # 序列化类里有超链接API是必须传context return Response(bs.data) def post(self, request): # post请求的数据(生成记录) bs = BookModelSerializer(data=request.data, context={'request': request}) # 序列化类里有超链接API是必须传context print(request.data) if bs.is_valid(): # ModelSerializer可以做校验 print(bs.validated_data) bs.save() # create方法 return Response(bs.data) else: return Response(bs.errors) class BookDetailView(APIView): def get(self, request, id): """查看具体的某个数据""" book = Book.objects.filter(pk=id).first() bs = BookModelSerializer(book, context={'request': request}) return Response(bs.data) def put(self, request, id): """更新具体的某个数据""" book = Book.objects.filter(pk=id).first() bs = BookModelSerializer(book, data=request.data, context={'request': request}) if bs.is_valid(): # 校验通过 bs.save() # update方法 return Response(bs.data) else: return Response(bs.errors) def delete(self, request, id): """删除具体的某本书籍""" Book.objects.filter(pk=id).delete() return Response()