• APIView源码与Request源码分析


    一、APIView源码分析

    1、安装djangorestframework

    2、使用

    drf是基于cbv view的封装,所以必须写cbv

    ①第一步:写视图,必须写cbv

    路由配置:

    from rest_framework.views import APIView
    from django.http import JsonResponse
    class Books(APIView):
        def get(self, request):
            # request是被封装后的request,原生的request在request._request
            # 如果想用原生request中的属性,还是原来的用法,因为Request重写了__getattr__方法
            # 原生django只能处理urlencoded和form_data编码,如果是json格式,原生django是不能处理的,需要自己从body中取出来自行处理
            # request.data 不管前端传数据的编码格式是urlencoded,form_data或者是json,都从里面取值
            # request.data
            # request.query_params  是原来django原生的GET中的数据
            # self.FILES  就是上传的文件
            dic = {'name': 'lqz', 'age': 30, 'height': 178, 'hobby': ['football', 'swimming', 'running']}
            return JsonResponse(dic)

    ②第二步:

      在setting中配置:INSTALLED_APPS= ['rest_framework']

    3、源码分析

    继承了APIView之后:

      ①所有的请求都没有csrf的认证了

      ②在APIView中as_view本质还是调用了父类的as_view(View的as_view)

      ③as_view中调用了dispatch(这个dispatch是APIView的dispatch) 

      注意:找dispatch不能直接点源码找先要在类里找类没有再去父类里面找

    APIView的dispatch方法:

    ①对原生request对象做了一层包装(面向对象的封装),

      以后再用的request对象都新的request对象

     

      ②在APIView中self.initial(request, *args, **kwargs),里面有频率控制,权限控制和认证相关

      ③根据请求方法执行咱们写的视图类中的相应方法 (视图类中方法的request对象,已经变成了封装后的request)

     

    二、request源码分析

    ①新的request为啥能点出原来的属性:

    内部反射在原生的request取出GET,POST,因为Request重写了__getattr__方法,跟原来用法一样

    ②原生django只能处理urlencoded和form_data编码,如果是json格式,原生django是不能处理的,需要自己从body中取出来自行处理

    不管前端传数据的编码格式是urlencoded,form_data或者是json,都从request.data里面取值

    ③请求里面可以带过滤条件这里就是用到query_params,是原来django原生的GET的数据

    ④上传的文件是从FILES中取(request.FILES)



    总结:

    继承了APIView之后:
        所有的请求都没有csrf的认证了
        在APIView中as_view本质还是调用了父类的as_view(View的as_view)
        as_view中调用了dispatch(这个dispatch是APIView的dispatch)
    
    APIView的dispatch方法:
        对原生的request对象做了一层包装(面向对象的封装),以后再用的request对象都是新的request对象
        在APIView中self.initial(request, *args, **kwargs),里面有频率控制,权限控制和认证相关
        根据请求方法执行咱们写的视图类中的相应方法(视图类中方法的request对象,已经变成了封装后的request)
    
    request类
        原生的request是self._request
        取以post提交的数据,从request.data中取出(urlencoded, form_data, json格式)
    
        query_params 就是原生request的GET的数据
        上传的文件是从FILES中取(request.FILES)
        (重点)其他的属性,直接request.属性名(因为重写了__getattr__方法)
    
    
    class Books(APIView):
        def get(self, request):
            # request是被封装后的request,原生的request在request._request
            # 如果想用原生request中的属性,还是原来的用法,因为Request重写了__getattr__方法
            # 原生django只能处理urlencoded和form_data编码,如果是json格式,原生django是不能处理的,需要自己从body中取出来自行处理
            # request.data 不管前端传数据的编码格式是urlencoded,form_data或者是json,都从里面取值
            # request.data
            # request.query_params  是原来django原生的GET中的数据
            # self.FILES  就是上传的文件
            dic = {'name': 'lqz', 'age': 30, 'height': 178, 'hobby': ['football', 'swimming', 'running']}
            return JsonResponse(dic)
  • 相关阅读:
    [PHP]解决PHP Call to undefined function ldap_connect()
    [Nginx] Nginx配置PHP应用传递PATH_INFO变量
    [PHP]解决PHP Fatal error: Call to undefined function mcrypt_get_iv_size()
    [CentOS] centos下安装最新稳定版nginx
    [CentOS]查看centos的发行版本情况
    [MySQL]创建用户并指定某一数据库权限
    [PHP] 安装memcached扩展
    [http]301和302的区别
    [javascript] 报错SecurityError: Failed to read the 'localStorage' property from 'Window': Access is denied for this document.
    [GO项目]开源免费在线客服系统-真正免费开源-GOFLY0.3.5发布-极简强大Go语言开发WEB网页客服
  • 原文地址:https://www.cnblogs.com/zhangguosheng1121/p/11121854.html
Copyright © 2020-2023  润新知