drf-router 와 authenticate 인증 소스 분석

경로
Rest Framework 에서 두 개의 router 를 제공 하여 경로 의 자동 생 성 을 신속하게 실현 할 수 있 습 니 다.
ModelViewSet 의 보기 클래스 를 계승 해 야 자동 으로 경로 가 생 성 됩 니 다.
SimpleRouter
사용 방법:
urls.py

#    :  routers  
from rest_framework import routers

#    :       
router = routers.SimpleRouter()  

#    :  ( register('  ', viewset   ,      ) )
router.register('books', views.BooksViewset)

#    :           
#    :
urlpatterns = [
    ...
]
urlpatterns += router.urls

#    :
urlpatterns = [
    ...
    url(r'^', include(router.urls))
]


#       
<URLPattern '^books/$' [name='books-list']>
<URLPattern '^books/(?P<pk>[^/.]+)/$' [name='books-detail']>
DefaultRouter
DefaultRouter 와 SimpleRouter 의 차 이 는 DefaultRouter 는 기본 API 루트 보 기 를 추가 하여 모든 목록 보 기 를 포함 하 는 하이퍼링크 응답 데 이 터 를 되 돌려 줍 니 다.

#     SimpleRouter  
<URLPattern '^books/$' [name='books-list']>
<URLPattern '^books/(?P<pk>[^/.]+)/$' [name='books-detail']>

#          ,
#  :http://127.0.0.1:8000/books.json
<URLPattern '^books\.(?P<format>[a-z0-9]+)/?$' [name='books-list']>
# http://127.0.0.1:8000/books/1.json
<URLPattern '^books/(?P<pk>[^/.]+)\.(?P<format>[a-z0-9]+)/?$' [name='books-detail']>

#       http://127.0.0.1:8000/
<URLPattern '^$' [name='api-root']>, <URLPattern '^\.(?P<format>[a-z0-9]+)/?$' [name='api-root']>
action 의 사용
action 은 ModelViewSet 의 보기 류 에서 사용자 정의 함 수 를 계승 하기 위해 서 입 니 다.
예 를 들 어 다음 과 같다.

from rest_framework.viewsets import ModelViewSet
from rest_framework.response import Response
from app01.ser import BooksSerializers
from app01.models import Books


class BooksViewSet(ModelViewSet):
    queryset = Books.objects.all()
    serializer_class = BooksSerializers

    #           ,   action  
    def get_num(self, request, pk):
        book = self.get_queryset()[:int(pk)]
        ser = self.get_serializer(book, many=True)
        return Response(ser.data)
사용 예시:
action 은 장식 기 입 니 다.장식 되 어 있 는 함수 위 에 놓 습 니 다.
method:요청 방식
detail:pk―>True 표시 경로 형식 은xxx/<pk>/action /―False 표시 경로 형식 은xxx/action /

from rest_framework.viewsets import ModelViewSet
from rest_framework.response import Response
from rest_framework.decorators import action
from app01.ser import BooksSerializers
from app01.models import Books


class BooksViewSet(ModelViewSet):
    queryset = Books.objects.all()
    serializer_class = BooksSerializers

    @action(methods=['GET', 'POST'], detail=True)
    def get_num(self, request, pk):
        book = self.get_queryset()[:int(pk)]	#        
        ser = self.get_serializer(book, many=True)
        return Response(ser.data)
    
    
#       
http://127.0.0.1:8000/books/2/get_num/
<URLPattern '^books/(?P<pk>[^/.]+)/get_num/$' [name='books-get-num']>
인증
인 증 된 표기 법
  • 인증 클래스 를 작성 하고 BaseAuthentication 을 계승 하 며 authenticate 를 다시 작성 합 니 다.인증 의 논 리 는 안에 쓰 여 있 습 니 다.인증 통과,두 값 을 되 돌려 줍 니 다.하 나 는 Request 대상 에 게 주 는 user 입 니 다.인증 에 실 패 했 습 니 다.이상 던 지기:APIException 또는 AuthenticationFailed
  • 인증 류 를 인증 보기 류authentication_classes = [ 1]에 추가
  • 전역 사용 또는 국부 사용
  • 
    #     , setting.py   
    REST_FRAMEWORK={
        "DEFAULT_AUTHENTICATION_CLASSES":["app01.app_auth.MyAuthentication",]
    }
    
    #     ,      
    authentication_classes=[MyAuthentication]
    #     
    authentication_classes=[]
    인증 소스 분석
    1,APIView 재 작성 asview 방법 은 csrf 인증 없 이 dispatch 방법 을 정상적으로 실행 하지만 dispatch 방법 은 APIView 에 의 해 재 작성 되 었 습 니 다.dispatch 에서 self.initial 인증 방법 을 실 행 했 습 니 다.>인증,권한,주파수 가 있 습 니 다.
    2.지금 은 인증 소스 만 본다self.perform_authentication(request)3.단self.perform_authentication(request)한 마디 로:request.user그러면 drf 의 Request 대상 에서 user 속성(방법)을 찾 아야 합 니 다.
    
    @property
    def user(self):
        #             '_user'    ,         ,          
        if not hasattr(self, '_user'):
            with wrap_attributeerrors():
                #     ,     
                self._authenticate()
        #    ,      
        return self._user
    4.Request 클래스 의 user 방법,처음 왔 을 때_user,가지 않 았 습 니 다self._authenticate()5.핵심,바로 Request 류 중의_authenticate(self)
    
    def _authenticate(self):
        
        #          ,    
        # self.authenticators                     list
        # self.authenticators           :authentication_classes = [   1,   2]           :
        
        ――――>self.authenticators ==》 [   1  ,   2  ]
        for authenticator in self.authenticators:
            try:
                
                #          authenticate(     self,request  )
                """
                def authenticate(self, request):
            		return (self.force_user, self.force_token)
                """
                #    :               tuple
                #       try  ,          ,          
                user_auth_tuple = authenticator.authenticate(self) # self request  
            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
    	#      user_auth_tuple  ,      ,     "    "   "      ",    
        self._not_authenticated()
    인증 구성 요소 사용
    1.인증 클래스 를 작성 하고 BaseAuthentication 을 계승 하여 authenticate 를 다시 씁 니 다.
    
    # app01_auth.py
    from rest_framework.authentication import BaseAuthentication
    from rest_framework.exceptions import AuthenticationFailed
    from app01.models import UserToken
    
    
    class TokenAuthentication(BaseAuthentication):
        def authenticate(self, request):
            #     ,      ,     
            #       ,  AuthenticationFailed  
            token = request.data.get('token')
            if token:
                user_token = UserToken.objects.filter(token=token).first()
    
                #     
                if user_token:
                    return UserToken.user, token
                else:
                    raise AuthenticationFailed('    ')
            else:
                raise AuthenticationFailed('        token')
    2.인증 류 를 인증 보기 류authentication_classes = [ 1]에 추가
    
    # views.py
    from rest_framework.viewsets import ModelViewSet
    from rest_framework.views import APIView
    from rest_framework.response import Response
    from app01.models import Books, UserInfo, UserToken
    from app01.ser import BooksSerializer
    from app01.app01_auth import TokenAuthentication
    import uuid
    
    
    #   Books          
    class BooksView(ModelViewSet):
        authentication_classes = [TokenAuthentication]
    
        queryset = Books.objects.all()
        serializer_class = BooksSerializer
    
    
    #     ,     token,   token  
    class LoginView(APIView):
    
        def post(self, request):
            response_msg = {'status': 200, 'msg': ''}
            username = request.data.get('username')
            password = request.data.get('password')
            user_obj = UserInfo.objects.filter(username=username, password=password).first()
    
            if user_obj:
                #              
                token = uuid.uuid4()
                
                #   UserToken  ,update_or_create    ,     
                UserToken.objects.update_or_create(defaults={'token': token}, user=user_obj)
                response_msg['msg'] = '    '
                response_msg['token'] = token
            else:
                response_msg['msg'] = '       '
                response_msg['status'] = 204
            return Response(response_msg)
    여기 서 drf-router 와 authenticate 인증 소스 분석 에 관 한 글 은 여기까지 소개 되 었 습 니 다.더 많은 drf-router 와 authenticate 내용 은 저희 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부탁드립니다!

    좋은 웹페이지 즐겨찾기