Django REST_프레임워크 프레임워크 03
원본 코드
권한 구성 요소의 원본 실행 과정은 이전 인증 구성 요소와 같습니다. 다음과 같습니다.
self.check_permissions(request)
def check_permissions(self, request):
"""
Check if the request should be permitted.
Raises an appropriate exception if the request is not permitted.
"""
for permission in self.get_permissions():
if not permission.has_permission(request, self):
self.permission_denied(
request, message=getattr(permission, 'message', None)
)
사고: 권한 인증을 하려면 현재 로그인한 사용자가 누구인지 알아야 한다. 그러면 우리는 어떻게 알 수 있을까?우선restframework의 세 구성 요소는 순서대로 실행됩니다.
#
self.perform_authentication(request)
#
self.check_permissions(request)
#
self.check_throttles(request)
첫 번째로 실행된 인증 구성 요소 원본 코드에 이런 코드가 있습니다
self.user, self.auth = user_auth_tuple
이userauth_tuple은 공교롭게도 우리가 사용자 정의 인증 보기를 만들 때 되돌아온 원조이다
class TokenAuth(BaseAuthentication):
def authenticate(self, request):
......
return token_obj.user, token_obj.token #
그래서 이때의self.user=token_obj.user,self.auth=token_obj.token
부분 보기 권한
앱01.service.permissions.py:
from rest_framework.permissions import BasePermission
class SVIPPermission(BasePermission):
message = "SVIP " #
def has_permission(self, request, view): #
if request.user.user_type == 3:
return True
return False
views에서.py:
class AuthorView(viewsets.ModelViewSet):
authentication_classes = [TokenAuth,]
permission_classes = [SVIPPermission,]
queryset = Author.objects.all()
serializer_class = AuthorModelSerializers
글로벌 뷰 사용 권한
REST_FRAMEWORK={
"DEFAULT_AUTHENTICATION_CLASSES":["app01.service.auth.Authentication",],
"DEFAULT_PERMISSION_CLASSES":["app01.service.permissions.SVIPPermission",]
}
throttle 구성 요소
원본 코드
self.check_throttles(request)
def check_throttles(self, request):
"""
Check if request should be throttled.
Raises an appropriate exception if the request is throttled.
"""
for throttle in self.get_throttles():
if not throttle.allow_request(request, self):
self.throttled(request, throttle.wait())
부분 뷰throttle
앱01.service.throttles.py:
from rest_framework.throttling import BaseThrottle
class VisitThrottle(BaseThrottle):
def allow_request(self,request,view):
if 1:
return True
return False
views에서.py:
from app01.service.throttles import *
class BookViewSet(generics.ListCreateAPIView):
throttle_classes = [VisitThrottle,]
queryset = Book.objects.all()
serializer_class = BookSerializers
전역 보기 throttle
REST_FRAMEWORK={
"DEFAULT_AUTHENTICATION_CLASSES":["app01.service.auth.Authentication",],
"DEFAULT_PERMISSION_CLASSES":["app01.service.permissions.SVIPPermission",],
"DEFAULT_THROTTLE_CLASSES":["app01.service.throttles.VisitThrottle",]
}
내장 throttle 클래스
https://www.cnblogs.com/yuanchenqi/articles/8719520.html#_label3
파서
해석기는 수신된 데이터를 우리가 필요로 하는 데이터 형식으로 변환하는 반서열화 과정이다. 예를 들어 앞에서 전송된 JSON을 사전으로 해석하는restframework는 Request에서 직접 사용할 수 있습니다.데이터에서 반서열화된 JSON 데이터를 꺼내면 해상도에 의존합니다
부분 뷰
from rest_framework.parsers import JSONParser,FormParser
class PublishViewSet(generics.ListCreateAPIView):
parser_classes = [FormParser,JSONParser] # ,
queryset = Publish.objects.all()
serializer_class = PublshSerializers
def post(self, request, *args, **kwargs):
print("request.data",request.data)
return self.create(request, *args, **kwargs)
글로벌 뷰
REST_FRAMEWORK={
"DEFAULT_AUTHENTICATION_CLASSES":["app01.service.auth.Authentication",],
"DEFAULT_PERMISSION_CLASSES":["app01.service.permissions.SVIPPermission",],
"DEFAULT_THROTTLE_CLASSES":["app01.service.throttles.VisitThrottle",],
"DEFAULT_THROTTLE_RATES":{
"visit_rate":"5/m",
},
"DEFAULT_PARSER_CLASSES":['rest_framework.parsers.FormParser',]
}
저희가 parser를 설정하지 않으면...classes. 그러면 부류에서 찾을 거예요.
parser_classes = api_settings.DEFAULT_PARSER_CLASSES
부모 클래스의 기본 설정은 JSON 데이터와urlencoded 데이터 등을 포함하는 세 가지 해석을 포함하고 있기 때문에 수정할 필요가 없습니다
'DEFAULT_PARSER_CLASSES': (
'rest_framework.parsers.JSONParser',
'rest_framework.parsers.FormParser',
'rest_framework.parsers.MultiPartParser'
),
사고: 실제 개발 과정에서 만약에 우리가 특수한 데이터 유형을 해석해야 한다면 스스로 해석기(클래스)를 써서 파라세프 에 추가할 수 있다.classes = []에서 request를 사용할 수 있습니다.데이터에서 이런 특수한 데이터 형식의 반서열화된 결과를 직접 꺼냈다
URLs-라우팅 제어 보완 사항
URL 추가 봉인
원래 url
우리는 아래의 두 개의 URL이 모두 하나의 보기 클래스를 겨냥하고 있다는 것을 알고 있지만, 각 테이블에 두 개의 URL을 쓰면 코드가 중복될 수 있다. 왜냐하면 서로 다른 테이블의 모든 URL은 보기 클래스의 이름과 반방향 해석의 이름만 차이가 있기 때문이다. 여기는 더욱 봉인할 수 있다
url(r'^authors/$', views.AuthorView.as_view({"get": "list", "post": "create"}), name="author"),
url(r'^authors/(?P\d+)/$', views.AuthorModelView.as_view({"get":"retrieve","put":"update","delete":"destroy"}),name="detailauthor"),
class AuthorView(viewsets.ModelViewSet):
queryset = Author.objects.all()
serializer_class = AuthorModelSerializers
새 url
from rest_framework import routers
from django.conf.urls import include
from app01 import views
router = routers.DefaultRouter() #
router.register(r'authors', views.AuthorView) # , ,
urlpatterns = [
url(r'^admin/', admin.site.urls),
url('', include(router.urls)),
]
다시 방문하면 자동으로 네 개의 URL이 생성됩니다
^authors/$ [name='author-list']
^authors\.(?P[a-z0-9]+)/?$ [name='author-list']
^authors/(?P[^/.]+)/$ [name='author-detail']
^authors/(?P[^/.]+)\.(?P[a-z0-9]+)/?$ [name='author-detail']
페이지 구성 요소
from rest_framework.pagination import PageNumberPagination, LimitOffsetPagination
페이지 나누기 A - 단순 페이지 나누기
class PNPagination(PageNumberPagination):
page_size = 2 #
page_query_param = 'page' #url get , ?page=2
page_size_query_param = 'size' #url , , ?size=2
max_page_size = 3 # page_size_query_param ,
페이지 분할기 B - 오프셋 페이지 분할
class MyLimitOffsetPagination(LimitOffsetPagination):
default_limit = 3 #
limit_query_param = 'limit' #url ,
offset_query_param = 'offset' #url , , 0 , limit
viewsA:
class BookView(APIView):
def get(self, request):
book_list = Book.objects.all()
#
pnp = MyLimitOffsetPagination()
pager_books = pnp.paginate_queryset(book_list, request, self)
ret = BookModelSerializers(pager_books, many=True, context={'request': request})
# Response rest_framework
return Response(ret.data)
viewsB:
class AuthorView(viewsets.ModelViewSet):
queryset = Author.objects.all()
serializer_class = AuthorModelSerializers
pagination_class = MyLimitOffsetPagination #
{
"count": 4, #
"next": "http://127.0.0.1:8000/authors/?page=2", # url
"previous": null,
......
}
페이지 오프셋 예
페이지마다 하나의 데이터를 표시하는 동시에 첫 번째 데이터부터 오른쪽으로 두 개의 데이터를 이동하여 결과는 세 번째 데이터입니다http://127.0.0.1:8000/books/?limit=1&offset=2페이지마다 두 개의 데이터를 표시하는 동시에 첫 번째 데이터부터 오른쪽으로 두 개의 데이터를 이동하여 결과는 세 번째 네 번째 데이터이다http://127.0.0.1:8000/books/?limit=2&offset=2
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Django 라우팅 계층 URLconf 작용 및 원리 해석URL 구성(URLconf)은 Django가 지원하는 웹 사이트의 디렉토리와 같습니다.그것의 본질은 URL과 이 URL을 호출할 보기 함수 사이의 맵표입니다. 위의 예제에서는 URL의 값을 캡처하고 위치 매개 변수로...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.