码迷,mamicode.com
首页 > 编程语言 > 详细

python-django rest framework框架之dispatch方法源码分析

时间:2018-02-05 20:10:07      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:from   ret   framework   finalize   hand   blog   response   name   方式   

1.Django的 CBV 中在请求到来之后,都要执行dispatch方法,dispatch方法根据请求方式不同触发 get/post/put等方法

class APIView(View):
    def dispatch(self, request, *args, **kwargs):#1.1 把wsgi的request进行封装
        request = self.initialize_request(request, *args, **kwargs)
        self.request = request     #此时的self.request 是rest_framework的Request对象,它里面比wsgi的request多了一些东西

        try:
            #1.2 进行 初始化     :版本,认证,权限,访问频率
            self.initial(request, *args, **kwargs)
#1.3 反射执行get等方法 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) #1.4 把返回的response 再进行封装 self.response = self.finalize_response(request, response, *args, **kwargs) #1.5 返回 return self.response

第1.1步:

from rest_framework.request import Request

class APIView(View):
    def initialize_request(self, request, *args, **kwargs):
       #返回了一个rest_framework的Request对象
        return Request(
            request,
       #1.1.1 parsers
=self.get_parsers(),
       #1.1.2 authenticators
=self.get_authenticators(),
       #1.1.3 negotiator
=self.get_content_negotiator(), )

第1.1.1步:

  pass

第1.1.2步:

class APIView(View):
    def get_authenticators(self):
     #self.authentication_classes = api_settings.DEFAULT_AUTHENTICATION_CLASSES 是从配置文件中取数据,从变量名不难看出有可能是很多类的列表
return [auth() for auth in self.authentication_classes]
     #self.authenticators = 一个多个对象的列表

第1.2步:

class APIView(View):
    def initial(self, request, *args, **kwargs):
     #版本相关
     version, scheme = self.determine_version(request, *args, **kwargs)
#1.2.1认证相关 self.perform_authentication(request) #1.2.2权限相关 self.check_permissions(request) #1.2.3访问频率相关 self.check_throttles(request)

第1.2.1步:

class APIView(View):
    def perform_authentication(self, request):
     #1.2.1.1
        request.user

第1.2.1.1步:

class Request(object):    
    @property
    def user(self):       #此时的self 是 rest_framework的request对象
        if not hasattr(self, _user):
            with wrap_attributeerrors():
          #1.2.1.1.1 self._authenticate()
return self._user

1.2.1.1.1步:

class Request(object):    
    def _authenticate(self):
        #此时的self 是 rest_framework的request对象
for authenticator in self.authenticators: #self.authenticators = 一个多个对象的列表 try:
          #执行每个对象的authenticate方法 user_auth_tuple
= authenticator.authenticate(self)   #从变量的名不难看出 返回了一个元组 except exceptions.APIException: self._not_authenticated() raise if user_auth_tuple is not None: self._authenticator = authenticator
          #赋值, request.user和request.auth 并返回 self.user, self.auth
= user_auth_tuple return self._not_authenticated()

第1.3步反射执行get等方法

 

最后、我们可以自定义一个简单的用户认证

class MyAuth(object):
    def authenticate(self,request):
        return "1111","222"
    
class Host(APIView):
    authentication_classes=[MyAuth]
    def get(self,request):
        print(request.user)    #1111
        print(request.auth)   #222
        return HttpResponse("666")

 

python-django rest framework框架之dispatch方法源码分析

标签:from   ret   framework   finalize   hand   blog   response   name   方式   

原文地址:https://www.cnblogs.com/liuwei0824/p/8418998.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!