• rest_framework框架


    回顾CBV

      什么是CBV

      CBV(class base  view),基于类的视图编程方式,即在view.py文件中使用类的方式为API接口书写对应的视图。与CBV对应的是FBV(function base view),基于函数的视图编程方式。

      CBV的简单示例

    # 路由部分
    from django.conf.urls import url,include
    from . import views
    
    urlpatterns = [
        url(r'^book/$',views.BookSerializers.as_view()),
    ]
    
    # 视图部分
    class BookSerializers(View):
    
        def get(self,request):
            return HttpResponse("GET")
    
        def post(self,request):
            return HttpResponse("POST")

      

    代码分析

    as_view部分

     1  @classonlymethod
     2     def as_view(cls, **initkwargs):
     3         """
     4         Main entry point for a request-response process.
     5         """
     6         for key in initkwargs:
     7             if key in cls.http_method_names:
     8                 raise TypeError("You tried to pass in the %s method name as a "
     9                                 "keyword argument to %s(). Don't do that."
    10                                 % (key, cls.__name__))
    11             if not hasattr(cls, key):
    12                 raise TypeError("%s() received an invalid keyword %r. as_view "
    13                                 "only accepts arguments that are already "
    14                                 "attributes of the class." % (cls.__name__, key))
    15 
    16         def view(request, *args, **kwargs):
    17             self = cls(**initkwargs)
    18             if hasattr(self, 'get') and not hasattr(self, 'head'):
    19                 self.head = self.get
    20             self.request = request
    21             self.args = args
    22             self.kwargs = kwargs
    23             #为捕获到异常,最后实际上就是执行dispatch()方法
    24             return self.dispatch(request, *args, **kwargs)
    25         view.view_class = cls
    26         view.view_initkwargs = initkwargs
    27 
    28         # take name and docstring from class
    29         update_wrapper(view, cls, updated=())
    30 
    31         # and possible attributes set by decorators
    32         # like csrf_exempt from dispatch
    33         update_wrapper(view, cls.dispatch, assigned=())
    34         return view                    

    dispatch部分

    1     def dispatch(self, request, *args, **kwargs):
    2         # Try to dispatch to the right method; if a method doesn't exist,
    3         # defer to the error handler. Also defer to the error handler if the
    4         # request method isn't on the approved list.
          #根据请求的方法遍历http_method_names进行匹配,匹配成功返回子类的请求方法的方法名,供路由去执行该方法
    5         if request.method.lower() in self.http_method_names:
    6             handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
    7         else:
    8             handler = self.http_method_not_allowed
    9         return handler(request, *args, **kwargs)

    rest_framework

    什么是rest_framework

      是一个前后端分离的框架系统,使前、后端开发着可以脱离对方的工作,从而只考虑自己业务内容的代码逻辑的一个框架。

    get方法代码示例

     1 from django.shortcuts import render,HttpResponse
     2 from django.views import View
     3 from . import models
     4 # Create your views here.
     5 
     6 """
     7     使用CBV的方式进行视图编程
     8 """
     9 
    10 from rest_framework import serializers
    11 
    12 
    13 # 仿照form的思想,组装成Serializers的数据形式,为后面的序列化类最准备
    14 class BookSerializers(serializers.Serializer):
    15         title=serializers.CharField(max_length=32)
    16         price=serializers.IntegerField()
    17         pub_date=serializers.DateField()
    18         #  一对多字段,source定义关联表的具体字段
    19         publish=serializers.CharField(source="publish.pk")
    20         # 多对多字段,采用自定义方法的方式定义显示的字段
    21         authors = serializers.SerializerMethodField()
    22 
    23         #  自定义函数名= get_ + authors,ob代表当前的book对象
    24         def get_authors(self,obj):
    25             temp=[]
    26             for author in obj.authors.all():
    27                 temp.append({"pk":author.pk,"name":author.name})
    28             return temp
    29 
    30 
    31 from rest_framework.response import Response
    32 from rest_framework.views import APIView
    33 
    34 
    35 """
    36     功能:
    37         向客户端返回http请求
    38     知识点:
    39         使用rest_framework组件,返回http请求,必须要继承 rest_framework的 APIView,不再继承Django的View
    40 """
    41 class BookView(APIView):
    42 
    43     def get(self,request):
    44         # 拿到一个QuerySet对象,包含着所有的book对象
    45         book_query = models.Book.objects.all()
    46         """
    47             功能:
    48                 声明要对哪些对象的哪些字段进行序列化
    49             参数说明:
    50                 当只是对一个对象进行序列话的时候,many=FALSE,但是对多个对象进行序列化的时候需要many=True
    51         """
    52         response = BookSerializers(book_query,many=True)
    53         # 序列化的结果保存在data方法中
    54         # 使用rest_framework的serializers进行序列化之后的json字符串,需要用Response方法返回
    55         return Response(response.data)

    对于 BookSerializers 类可以改变继承的类,减少代码

     1 """
     2     方式二:
     3         继承serializers.ModelSerializer类,组装数据格式。
     4         与ModelForm做类比
     5 """
     6 class BookSerializers(serializers.ModelSerializer):
     7     class Meta:
     8         model=models.Book
     9         fields="__all__"
    10 
    11     authors = serializers.SerializerMethodField()
    12     def get_authors(self,obj):
    13         temp=[]
    14         for author in obj.authors.all():
    15             temp.append({"pk":author.pk,"name":author.name})
    16         return temp
  • 相关阅读:
    Python 极简教程(十)集合 set
    Python 极简教程(九)元组 tuple
    Python 极简教程(七)列表 list
    Python 极简教程(八)字符串 str
    DevOps实践之一:基于Docker构建企业Jenkins CI平台
    kubernetes实践之一:kubernetes二进制包安装
    Linux挖矿病毒 khugepageds详细解决步骤
    kubernetes实践之五:深入理解Service及内部DNS搭建
    kubernetes实践之四:深入理解控制器(workload)
    kubernetes实践之三:深入理解Pod对象
  • 原文地址:https://www.cnblogs.com/liuyinzhou/p/8746695.html
Copyright © 2020-2023  润新知