一、什么是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
重点掌握
#request.data 是个方法,包装成了属性,前台传过来body体中数据的数据,放在里面 #request.query_params 这个是原来GET中的数据 #request把原来的request包装进去了 包装成了_request,方便读源码