首页 > 编程语言 >APIView基本使用、源码分析,Requset类源码分析,序列化组件的基本使用,反序列化

APIView基本使用、源码分析,Requset类源码分析,序列化组件的基本使用,反序列化

时间:2022-09-26 18:34:03浏览次数:51  
标签:__ APIView self request list 源码 序列化 book

1.APIView基本使用

1.1 使用View+JsonResponse写

class BookView(View):
    def get(self, request):
        book_list = Book.objects.all()
        res_list = []
        for book in book_list:
            res_list.append({'name': book.name, 'price': book.price, 'publish': book.publish})
        return JsonResponse(res_list,safe=False,json_dumps_params={'ensure_ascii':False})  # 只能序列化字典和列表,

1.2  使用APIView+drf的Response写

from rest_framework.views import APIView
from rest_framework.response import Response
from .models import  Book


class BookView(APIView):
    def get(self, request):  # 此时这个request不是原来的那个request,而是一个新的request,具体请看下面request类源码分析
     print(type(request._request)  res = Book.objects.all() list_res = [] for i in res: list_res.append({'name' : i.name, 'price' : i.price, 'publish' : i.publish}) return Response(list_res)

2.APIView的源码分析

# 视图类继承APIView后,执行流程就发生了变化,这个变化就是整个的drf的执行流程

# 一旦继承了APIView入口
    -路由配置跟之前继承View是一样的----》找视图类的as_view---》【APIView的as_view】
        @classmethod
        def as_view(cls, **initkwargs):
            # 又调用了父类(View)的as_view
            view = super().as_vi    ew(**initkwargs)
            '''
            # 从此以后,所有的请求都没有csrf的校验了
            # 在函数上加装饰器
            @csrf_exempt
            def index(request):
                pass
            本质等同于 index=csrf_exempt(index)
            '''
            return csrf_exempt(view)
        
    -请求来了,路由匹配成功会执行 View类的的as_view类方法内的view闭包函数(但是没有了csrf认证),
    -真正的执行,执行self.dispatch---->APIView的dispatch  【这是重点】
     def dispatch(self, request, *args, **kwargs):
        # 参数的request是原来的django原生的request
        # 下面的request,变成了drf提供的Request类的对象---》return Request(。。。)
        request = self.initialize_request(request, *args, **kwargs)
        # self 是视图类的对象,视图类对象.request=request 新的request
        self.request = request
        try:
            # 执行了认证,频率,权限 [不读]
            self.initial(request, *args, **kwargs)
            # 原来的View的dispatch的东西
            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

总的来说就是只要用了APIView就不会有scrf认证,request就变成了drf中的request(例如1.2中的那个request,具体了解请看request类源码分析),执行视图类的方法之前,执行了3大认证(认证,权限,频率),在执行三大认证和视图类的方法过程中只要报错,都会被捕获处理。

 

 

 3.Requset类源码分析

#1  视图类中使用的request对象,已经变成了drf提供的Request类的对象了
    -原生djagno 的request是这个类的对象:django.core.handlers.wsgi.WSGIRequest
    -drf的request是这个类的对象:rest_framework.request.Request
    
#2 request已经不是原来的request了,还能像原来的request一样使用吗?
    -用起来,像之前一样
        print(request.method)  # get
        print(request.path)  # /books/
        print(request.GET)   # 原来的get请求提交的参数
        print(request.POST)  # 原来post请求提交的参数
        
        
#3 Request的源码分析:rest_framework.request.Request
    -类中有个魔法方法:__getattr__    对象.属性,属性不存在会触发它的执行
    def __getattr__(self, attr): # 如果取的属性不存在会去原生django的request对象中取出来
        try:
            #反射:根据字符串获取属性或方法,self._request 是原来的request
            return getattr(self._request, attr)
        except AttributeError:
            return self.__getattribute__(attr)
        
    -以后用的所有属性或方法,直接用就可以了---》(通过反射去原来的request中取的)
    
    -新的request内部有个老的request,就是 request._request
    
    -data 是个方法,被property装饰了,变成了数据属性用
        -以后body体中提交的数据,都从这里取(request.POST)
        -urlencoded,form-data:提交的数据在request.POST中
        -json格式提交的数据,在requets.POST中没有,它在request.body中
        -现在无论那种格式,都从request.data中取
    -query_params:get请求提交的参数,等同于request._request.GET 或  request.GET
    -其他:取文件也是从request.FILES中取,跟之前一样
    
    
    
# 验证 原生requets.POST 只有urlencoded和form-data格式提交的数据,json格式提交的数据在body中,拿出来自己处理,但是drf的request中有个data,data中可以取到任意编码提交的数据
    
# request.data  有时候是(urlencoded,form-data)QueryDict,有时候(json)是字典
    
# 4 什么是魔法方法?
    1 在类中只要以__开头,__结尾的都称之为魔法方法
    2 这种方法不需要手动调用,某种情况会自动触发
    3 你学过的: __init__,__str__,__call__,......

4.序列化组件的基本使用

models中
from rest_framework import serializers class BookSerializer(serializers.Serializer): name = serializers.CharField() publish = serializers.CharField()
class BookView(APIView): 
    def get(self, request):
        book_list = Book.objects.all()
        #instance是qs对象,一定要传many=True
        ser = BookSerializer(instance=book_list, many=True)
        return Response(ser.data)
class BookDetailView(APIView):
    def get(self, request, pk):
        book = Book.objects.filter(pk=pk).first()
        ser = BookSerializer(instance=book)
        return Response(ser.data)

5.反序列化

增加修改

标签:__,APIView,self,request,list,源码,序列化,book
From: https://www.cnblogs.com/shangxin-bai/p/16731954.html

相关文章

  • 海外某音x-gorgon算法原理分析及算法源码公布
    算法源码见附件分享一个去年逆的一个海外版某音1474版本x-gorgon算法,这里简单介绍一下算法原理,首先malloc出来一个0x1A大小的空间,然后截取用户传入的byte数组中的参数,截......
  • 软件测试项目实战【不爱听书】测试全套教程以及源码
    前言软件测试流程:需求分析—>测试计划—>测试设计—>测试执行—>测试报告一、需求分析“不爱听书”是一个为用户提供创作音乐和收听音频的平台。对于该项目的需求分析,提......
  • 【安全测试】【fortify】【源码审计】windows下源码审计fortify安装及使用
    一、fortify安装(非商用,仅学习使用)1.解压安装包2.双击exe文件进行安装,下一步即可,直至完成  3.exe安装完成后,将下图三个文件拷贝到安装目录下的Core\config下替换 ......
  • 前后端开发模式,restful规范,序列化与反序列化,cbv源码
    1.前后端开发模式后端人员写前后端混合开发项目==》使用模板语法渲染   后端人员写前后端分离项目 ==》后端人员只负责写API,使用postman来测试接口,前端的人专......
  • 大并发服务器架构(陈硕muduo库源码解析)——源码分析篇
    muduo库分为base和net两个部分,base中是一些与网络无关的内容,net中时网络库的内容。首先看Timestamp类的源代码:我将每节课讲的代码都放在了myMuduoTest中。1.Timestamp......
  • 表单序列化得常用方法
    方法1:serialize():就是把表单信息序列化成一个字符串(认为最常用的方法)<html><head><scripttype="text/javascript"src="/jquery/jquery.js"></script><scriptty......
  • HashMap底层原理及jdk1.8源码解读
    一、前言写在前面:小编码字收集资料花了一天的时间整理出来,对你有帮助一键三连走一波哈,谢谢啦!!HashMap在我们日常开发中可谓经常遇到,HashMap源码和底层原理在现在面试中是......
  • SpringCloud/Alibaba学习+Nacos/Sentinel源码(五万字长文)
    SpringCloud学习笔记未经授权不得转载,创作不易,违者必究一、微服务架构1.1应用架构发展集中式架构网站流量很小,一个应用将所有功能部署优点:系统开发速度快;维护成本......
  • MJExtension 源码解析
    1.NSObject+MJClass为基类添加了一个Class相关的分类,用于获取设置所有关于Class的配置。1.1核心方法-遍历类的继承树/***遍历所有的类*/+(void)mj_enu......
  • SpringAOP源码分析
    AOP源码流程源码基于:Spring5.3.23版本当Spring开启切面后,会向Spring容器中添加一个BeanPostProcessor,即AbstractAutoProxyCreator,即对象通过反射初始化后执行的一个处理......