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