APIView源码:django
1.APIView继承了Viewjson
原生viewpost
二、APIView类里面有dispatch方法url
三、 APIView在原有的基础上,多了不少功能。request:进行了加工,是一个新的对象。spa
4.请求封装request = self.initialize_request(request, *args, **kwargs)(版本、认证、权限、节流、解析器)3d
5.认证rest
6.若是本身写了用户认证,就找本身的认证方法:code
7.加注释、initialorm
8.initial对象
9.认证
10.request是封装后的对象了,全部user应该去APIView里面找。
11._authenticate # 循环认证类的全部对象 [BasicAuthentication对象,]
.authenticate方法检查你是否已登入。若是用户没有登入则报错。
12.接下来本身定义一个认证方法:必须有authenticate方法:若是用户没有登入,则报错。
运行结果:url没有传token值,则认证失败
url传了token,认证成功
13.认证流程加注释
0.url.as_view -》 1.self.dispatch
self.dispatch
2.initial(版本、认证、权限、节流、解析器)
3.perform_authentication 实现认证
4. from rest_framework.request import Request 方便查询user
5.获取认证对象,进行一步步的认证
认证流程:view -> dispach -> 封装Request -> initial:(版本、认证、权限、节流、解析器)-> perform_authentication 实现认证 -user -> authenticate方法
若是认证成功有(token值),request.user则有值。
认证代码:
a. 认证 - 仅使用: from django.views import View from rest_framework.views import APIView from rest_framework.authentication import BasicAuthentication from rest_framework import exceptions from rest_framework.request import Request class MyAuthentication(object): def authenticate(self,request): token = request._request.GET.get('token') # 获取用户名和密码,去数据校验 if not token: raise exceptions.AuthenticationFailed('用户认证失败') return ("alex",None) def authenticate_header(self,val): pass class DogView(APIView): authentication_classes = [MyAuthentication,] def get(self,request,*args,**kwargs): print(request) print(request.user) ret = { 'code':1000, 'msg':'xxx' } return HttpResponse(json.dumps(ret),status=201) def post(self,request,*args,**kwargs): return HttpResponse('建立Dog') def put(self,request,*args,**kwargs): return HttpResponse('更新Dog') def delete(self,request,*args,**kwargs): return HttpResponse('删除Dog')