APIView源碼分析(小梅老師版本)

 

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')
相關文章
相關標籤/搜索