首页 > 其他分享 >drf-02

drf-02

时间:2022-09-26 22:56:27浏览次数:47  
标签:02 __ request self APIView 视图 序列化 drf

APIView

APIView基本使用

 1.drf:第三方app
 2.cbv的视图类:继承APIView类及其子类
 3.基于View与JsonResponse的视图类

 4.继承APIView+drf+Response的视图类(drf是app需要在settings配置文件中注册)
  4.1 无crsf校验
  4.2 APIView继承了View
  4.3 代码操作
   4.3.1 查询所有

   4.3.2 查询单个

   4.3.3 添加数据

   4.3.4 修改数据

   4.3.5 删除数据

APIView源码分析

 1.APIView源码分析

class BookView(APIView):
    def get(self, request):
        return Response(book_list)
  路由:path('books/', views.BookView.as_view())
  1.1 路由匹配成功 执行views.BookView.as_view()()
  1.2 查询as_view方法 自身没有 查询父类APIView as_view方法执行结果 取消了csrf校验 返回view
    @classmethod
    def as_view(cls, **initkwargs):
        return csrf_exempt(view)    # 相当于在函数上加装饰器取消csrf校验
    # 在函数上加装饰器
      @csrf_exempt
      def inner(request):
        pass
    # 等同于 inner = csrf_exempt(inner)
  1.3 查询view方法 自身没有 查询父类APIView 没有 查询继承的父类view view方法执行结果 self.dispatch方法
    def view(request, *args, **kwargs):
            return self.dispatch(request, *args, **kwargs)
 1.4 查询dispatch方法 自身没有 查询父类APIView 
     匹配请求类型 转为小写 查询是否存在该请求类型 有 通过反射获取 传入request方法返回执行请求方法
     def dispatch(self, request, *args, **kwargs):
       # dispatch方法中的参数request是django原生的request
        request = self.initialize_request(request, *args, **kwargs)
        # 重新赋值后的变量request是drf提供的Request类的对象
        # self是视图类的对象 
        self.request = request  # request是新的request
        self.headers = self.default_response_headers  # deprecate?

        try:
            # 执行了认证、频率、权限
            self.initial(request, *args, **kwargs)
            # 将请求类型变为小写 判断是否存在与请求类型中 存在返回执行该方法
            if request.method.lower() in self.http_method_names:
                handler = getattr(self, request.method.lower(),
                                  self.http_method_not_allowed)
            else:
                handler = self.http_method_not_allowed

            response = handler(request, *args, **kwargs)

        except Exception as exc:
            # 如果出现异常 捕获异常 处理异常 正常返回
            # 在执行三大认证和视图类中方法时 如果出现异常 执行异常捕获处理 
            response = self.handle_exception(exc)

        self.response = self.finalize_response(request, response, *args, **kwargs)
        return self.response
 1.5 查询请求方法 执行
  	class BookView(APIView):
    	def get(self, request):
        	return Response(book_list)
APIView:1.继承后就没有csrf认证
         2.视图类中使用的request对象是drf提供的Request类的对象
         3.执行视图类的方法之前 执行了3大认证(认证,权限,频率)
         4.在执行三大认证和视图类的方法过程中只要报错 都会被捕获处理

Request类源码分析

 1.Request类源码分析

1.Request类:视图类继承APIView 视图类中使用的request对象是drf提供的Request类的对象
             from rest_framework.request import Request
2.原生django的request对象:from django.core.handlers.wsgi import WSGIRequest
3.Request类对象和原生django的request方法使用方式一样
  request.method
  request.path
  request.POST
  request.GET
4.Request类的源码分析:from rest_framework.request import Request
  4.1 利用反射(根据字符串获取属性或方法)  self._request是原来的request
  class Request:
        def __init__(self, request, parsers=None, authenticators=None,
                 negotiator=None, parser_context=None):
        	self._request = request   # 原来的request
            
            def __getattr__(self, attr):  # __getattr__ 魔法方法 获取的属性值不存子啊时执行
                # 如果查询的属性不存在就去原生django中查询
                try:
                    return getattr(self._request, attr)
                	# 利用反射(根据字符串获取属性或方法)  self._request是原来的request
                except AttributeError:
                    return self.__getattribute__(attr)
  4.2 data方法 被property装饰 变成了属性
	  4.2.1 视图类继承View时
    		body中提交的数据——request.POST获取
       		urlencoded,form_data——request.POST
       		json格式提交数据——request.body
      4.2.2 视图类继承APIView时 通过data方法
    		无论哪种数据类型——request.data
        @property
        def data(self):
            if not _hasattr(self, '_full_data'):
                self._load_data_and_files()
            return self._full_data
  4.3 query_params是get请求的参数==request._request.GET或request.GET
  		@property
        def query_params(self):
            """
            More semantically correct name for request.GET.
            """
            return self._request.GET
  4.4 文件类型从request.FILES中获取
注:魔法方法:在类中以__开头 __结尾的称之为魔法方法
    当达到某些条件时自动触发
  如__init__  实例化
    __str__   打印
    __call__  对象加括号

序列化

序列化组件介绍

 1.序列化组件:用来序列化request对象或单个对象
 2.序列化:序列化器会把模型类对象转换成字典 经过response变成json字符串
 3.反序列化:把提交的数据经过request变成字典 序列化器可以把字典转成模型类对象
 注:drf提供一种可以快速序列化的类:序列化类

序列化组件的基本使用

 1.定义序列化类(序列化的字段) 写几个字段就序列化几个字段

 2.使用序列化类(序列化多条数据)

 3.使用序列化(序列化单条数据)

反序列化

 1.视图类

 2.序列化类

1.装饰在视图函数,只要一装饰,之后的request就可以使用request.data,这个data无论是那种编码格式,都有数据

def auth(func_name):
    def inner(request, *args, **kwargs):
        try:
            request.data = json.loads(request.body)
        except:
            request.data = request.POST    
        res = func_name(request, *args, **kwargs)
        return res
    return inner


@auth
def book(request):
    book_list_obj = models.Book.objects.all()
    book_list = []
    for book in book_list_obj:
        book_list.append({'name': book.name, 'price': book.price, 'publish': book.publish})
    return JsonResponse(book_list, safe=False, json_dumps_params={'ensure_ascii': False})

标签:02,__,request,self,APIView,视图,序列化,drf
From: https://www.cnblogs.com/040714zq/p/16732827.html

相关文章

  • 密码学奇妙之旅、02 混合加密系统、AES、RSA标准、Golang代码
    CTR计数器模式计数器模式CTR是分组密码模式中的一种。通过将逐次累加的计数器进行加密来生成密钥流的流密码。每次加密时会生成一个不同的值来作为计数器的初始值。可......
  • drf 反序列化报错
    解决思路:检查下自定义的序列化类是否有无重写。......
  • 【2022.9.26】drf(2)
    今日学习内容1APIView基本使用1.1使用View+JsonResponse写1.2使用APIView+drf的Response写(不要忘了注册rest_framework这个app)2APIView源码分析3Requ......
  • drf2-apiView源码-基本使用-request类源码分析-序列化组件-基本使用-反序列化
    apiView基本使用apiview源码分析request类源码分析序列化组件介绍序列化组件基本使用(查询所有,查询单个)反序列化(新增,修改)ApiView基本使用drf是一个第三方的app,只能......
  • The 2022 ICPC Asia Regionals Online Contest (II) B
    BNon-decreasingArray我们可以知道两个操作都是一样的那我们直接记dp[i][j]为前i个数选了j个数并且以ai为结尾的max状态转移直接枚举dp[k][j-1]+(a[i]-a[k])^2即可......
  • 做题记录整理dp13 P5664 [CSP-S2019] Emiya 家今天的饭(2022/9/26)
    P5664[CSP-S2019]Emiya家今天的饭终于遇到一个我感觉在考场上有可做出来的题了。。。唯一想不到的就是最开始的容斥(也就是说还是看了题解。。。),如果容斥想到的话其他......
  • 【2022-09-26】DRF从入门到入土(二)
    DRF从入门到入土(二)一、APIView基本使用使用view+JsonResponse获取所有图书接口安装drf:pip3installdjangorestframeworksettings.py注册app:'rest_framework......
  • 北京思特奇2023年校招笔试(Java)
    北京思特奇2023年校招笔试(Java)1、表达式(short)10/10.2*2运算后结果是什么类型?答案:double,浮点数默认是double,自动类型向上转换为浮点数类型2、serialVersionUID字......
  • 做题记录整理dp12 P7961 [NOIP2021] 数列(2022/9/26)
    P7961[NOIP2021]数列当时在考场上对于拿部分分这个感念不是很清晰,所以当时连暴力分都没拿。。。事实上这题在看了题解之后还是有很多地方没搞明白,比如最后统计答案,为什......
  • Test 2022.09.26
    今天是水题专场T1扩散感觉这种要么就是二分答案网络流,要么就是最小生成树,(随便口胡的),树德保留节目了属于是。分析简简单单一眼最小生成树(又是),边权就是两个点之间存在公......