APIView源码:
1.APIView继承了View
原生view
2、APIView类里面有dispatch方法
3、 APIView在原有的基础上,多了很多功能。request:进行了加工,是一个新的对象。
4.请求封装request = self.initialize_request(request, *args, **kwargs)(版本、认证、权限、节流、解析器)
5.认证
6.如果自己写了用户认证,就找自己的认证方法:
7.加注释、initial
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')