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")