APIView

一、什么是drf

#drf(django rest framework)框架(django的app)
#安装:
    djangorestframework
#它是一个app,所以需要在settings中注册
    只是快速的构建resful规范的接口
    csrf_exempt:局部禁用csrf(csrf是可以局部使用,局部禁用)
    以后再执行的dispatch方法是APIView的dispatch方法
    getattr和setattr
#重点掌握这三点:
    request.data 是个方法,包装成了属性,前台传过来body体中数据的数据,放在里面
    request.query_params  这个是原来GET中的数据
    request把原来的request包装进去了
from django.views.decorators.csrf import csrf_exempt,csrf_protect
 
  
csrf_exempt局部禁用
 
  
csrf_protect局部使用
 

 APIView的使用

#导入from rest_framework.views import APIView
#创建类继承APIView
class Books(APIView):
      #此处的request对象,已经不是django中的request中的对象了,它是
        # rest_framework.request t下的 Request
    def put(self,request,pk):    

#此时点API进去读源码

class APIView(View):       #继承了View
    @classmethod
    def as_view(cls, **initkwargs):       #重写了as_view的方法
          #执行父类的as_view方法,拿到view的内存地址,可看View
        view = super(APIView, cls).as_view(**initkwargs)
           #把原来的view.cls替换为现在的
        view.cls = cls
        view.initkwargs = initkwargs
    
            #这一步相当于给view添加了一个装饰器,
        return csrf_exempt(view)  #局部禁用csrf    
#执行的是父类的view方法,也就是base中的view方法,而view最终执行的是dispatch方法,所以,它会执行APIview中的dispatch方法


#此时来到APIview中的dispatch方法

    def dispatch(self, request, *args, **kwargs):
        self.args = args
        self.kwargs = kwargs        #简单的赋值


           #此时后边(括号内)request是原来的request,
           #经过initialize_request处理后,不再是request方法显然自己写的Books中没有    
           # initialize_request方法,所以执行的是父类API中的
  
        request = self.initialize_request(request, *args, **kwargs)
        
        self.request = request      #执行后的赋值
        self.headers = self.default_response_headers  

#此时点initialize_request进去

    def initialize_request(self, request, *args, **kwargs):

        parser_context = self.get_parser_context(request)
         
           #类实例化产生对象,产生这个Request对象,是drf的request
        return Request(
            request,    #原来的request
            # 解析用的
            parsers=self.get_parsers(),
            #认证用的
            authenticators=self.get_authenticators(),
           # 分页用的
            negotiator=self.get_content_negotiator(),
             #解析用
            parser_context=parser_context
        )

#此时点Request进去 (from rest_framework.request import Request点这也可以)
class Request(object):

    def __init__(self, request, parsers=None, authenticators=None,
                 negotiator=None, parser_context=None):
        assert isinstance(request, HttpRequest), (
            'The `request` argument must be an instance of '
            '`django.http.HttpRequest`, not `{}.{}`.'
            .format(request.__class__.__module__, request.__class__.__name__)
        )

        self._request = request      #原来的request变成_request
                                                 #所以在外界可以request._request拿到原来的

    def __getattr__(self, attr):

        try:

            #通过反射,去原来的request中拿出要取的属性(如:GET,POST...)
            return getattr(self._request, attr)
        except AttributeError:
            return self.__getattribute__(attr)

     #request.query_params  这个是原来GET中的数据
    @property
    def query_params(self):
        return self._request.GET

    #request.data 是个方法,包装成了属性,前台传过来body体中数据的数据,放在里面
    @property
    def data(self):
        if not _hasattr(self, '_full_data'):
            self._load_data_and_files()
        return self._full_data
View Code

 

重点掌握

#request.data 是个方法,包装成了属性,前台传过来body体中数据的数据,放在里面
#request.query_params  这个是原来GET中的数据
#request把原来的request包装进去了  包装成了_request,方便读源码

 

转载于:https://www.cnblogs.com/pdun/p/10872763.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值