drf-router 와 authenticate 인증 소스 분석
9020 단어 drf-routerauthenticate인증
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']>
DefaultRouterDefaultRouter 와 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']>
인증인 증 된 표기 법
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 내용 은 저희 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부탁드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Django contrib auth authenticate 함수 원본 분석django는 사용자의 로그인과 권한 수여에 사용되는 기본 auth 시스템을 제공하고 일정한 확장성을 제공하여 개발자가 여러 개의 검증 백그라운드를 스스로 정의할 수 있도록 합니다. 모든 검증 백그라운드는 authe...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.