<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      DRF路由、認證、權限、頻率

      Posted on 2022-11-27 21:36  呱呱呱呱嘰里呱啦  閱讀(40)  評論(0)    收藏  舉報

      DRF路由、認證、權限、頻率

      路由

      原來直接在urls.py中直接.as_view()即可

      現在

      # 一旦視圖類繼承了ViewSetMixin,則要在路由中配置actions函數
      

      繼承了ModelViewSet的視圖類

      # 自動配置路由
      from rest_framework import routers
      router = routers.SimpleRouter() # SimpleRouter只會生成兩條url
      router.register('books','views.BookViewSet') # router.register('前綴','繼承自ModelViewSet的視圖類','別名')
      
      urlpatterns += router.urls
      
      # 另有
      router = routers.DefaultRouter() # DefaultRouter會生成六條url
      

      action的使用

      from rest_framework.decorators import action
      class BookModelViewSet(ModelViewSet):
          queryset = Book.objects.all()
          serializer_class = BookSerializer
          @action(methods=['get',],detail=False) # 向'/get_2/'后綴發送列表中注冊的請求時會執行下面函數
          def get_2(self,request):
              book = self.get_queryset()[:2]
              ser = self.get_serializer(book,many=True)
      # 如果detail=True,則生成的路由中配置了有名分組pk,需要'/1/get_2'類似的請求,且函數應添加形參pk
      

      認證

      # 認證的實現
      '''
      1.寫一個類,繼承BaseAuthentication類
      from rest_framework.authentication import BaseAuthentication
      2.重寫authenticate方法,內有認證邏輯,認證通過返回兩個值一個值給request.user,另一個值給request.auth,認證失敗,拋出AuthenticationFailed異常
      3.
      '''
      

      源碼

      # APIView>dispatch>self.initial
      self.perform_authentication(request) # >return request.user
      class Request # 
          @property
          def user(self):
              self._authenticate()
      _authenticate():
          for authenticator in self.authenticators: # 循環自定義配置的認證類(列表)的認證對象列表
              user_auth_tuple = authenticator.authenticate(self) # 這里就用了自己重寫的authenticate方法
      

      寫認證類

      # 應用內新建python文件
      from rest_framework.authentication import BaseAuthentication
      
      
      class MyAuthentication(BaseAuthentication):
          def authenticate(self, request):
      

      認證類的使用

      # 全局使用
      from app01.Myauth import MyAuthentication
      REST_FRAMEWORK = {
          'DEFAULT_AUTHENTICATION_CLASSES': [
              'MyAuthentication',
      
          ],
      }
      # 在具體視圖類中定義authentica_classes為空列表可以局部禁用
      
      # 局部使用
      # 在視圖類中定義authentication_classes=[]
      

      權限

      源碼

      # APIView>dispatch>self.initial>self.check_permissions(request)
      

      權限的使用

      # 定義權限類
      from rest_framework.permissions import BasePermission
      class UserAdminPermission(BasePermission):
          def has_permission(self, request, view):
              user = request.user
              # print(user.get_permissions_display())
              if user.permissions == 1:
                  return True
              else:
                  return False
      
      # 局部使用
      class NewBooksView(ListAPIView, CreateAPIView):
          permission_classes = [UserAdminPermission]
          queryset = Book.objects.all()
          serializer_class = NewBookModelSerializer
      
      # 全局使用
      REST_FRAMEWORK = {
          'DEFAULT_PERMISSION_CLASSES': [
              'app01.123.UserAdminPermission',
      
          ],
      }
      
      # 局部禁用
      permission_classes = []
      

      內置權限

      from rest_framework.authentication import SessionAuthentication
      from rest_framework.permissions import IsAdminUser
      
      class NewBooksView(ListAPIView, CreateAPIView):
          authentication_classes = [SessionAuthentication]
          permission_classes = [IsAdminUser]
          queryset = Book.objects.all()
          serializer_class = NewBookModelSerializer
      

      頻率

      內置頻率

      # 全局使用
      REST_FRAMEWORK = {
          'DEFAULT_THROTTLE_CLASSES': ['rest_framework.throttling.AnonRateThrottle'],
          'DEFAULT_THROTTLE_RATES': {
              'anon':'3/m', # 限制匿名用戶每分鐘3次訪問
          }
      }
      # 局部使用
      REST_FRAMEWORK = {
          'DEFAULT_THROTTLE_RATES': {
              'anon':'3/m', # 限制匿名用戶每分鐘3次訪問
          }
      }
      class NewNewBooksView(ListAPIView, CreateAPIView):
          authentication_classes = [AnonRateThrottle]
      
          queryset = Book.objects.all()
          serializer_class = NewBookModelSerializer
      
      # 局部禁用
      class NewNewBooksView(ListAPIView, CreateAPIView):
          authentication_classes = []
      
      # 如果要使用內置登錄用戶頻率限制,則作用的也只是auth_user
      

      頻率限制

      # 新建頻率類繼承SimpleRateThrottle以重寫其內部的get_cache_key方法,并標明配置名稱
      from rest_framework.throttling import SimpleRateThrottle
      
      class MyThrottle(SimpleRateThrottle):
          scope = 'xxx'
          def get_cache_key(self, request, view):# return結果是頻率限制的key
              return request.META.get('REMOTE_ADDR')
      
      # 局部配置或者全局配置頻率類
      class BookView(ListAPIView):
          throttle_classes = [MyThrottle]
          queryset = models.Book.objects.all()
          serializer_class = BookModelSerializer
          pagination_class = MYLimitOffsetPagination
      # 全局配置對應名稱的頻率值限制
      REST_FRAMEWORK = {
          'DEFAULT_THROTTLE_RATES': {
              'xxx': '3/m',
          },
      }
      

      自定義頻率

      from rest_framework.throttling import BaseThrottle
      # 自定義頻率類,需要重寫兩個方法,即allow_request、wait
      class IPThrottle(BaseThrottle):
          visit_dict = {}
          def __init__(self):
              self.history_list = []
          def allow_request(self, request, view):
              ip = request.META.get('REMOTE_ADDR')
              ctime = time.time()
              if ip not in self.visit_dict:
                  self.visit_dict[ip] = [ctime,]
                  return True
              self.history_list = self.visit_dict[ip]
              while True:
                  if ctime-self.history_list[-1]>60:
                      self.history_list.pop()
                  else:
                      break
              if len(self.history_list)<2: # 配置一個周期內的頻次限制
                  self.history_list.insert(0,ctime)
                  return True
              else:
                  return False
          def wait(self):
              ctime = time.time()
              return 60 - (ctime-self.history_list[-1])
      
      from utils.throttle1 import IPThrottle
      class BookView(ListAPIView):
          throttle_classes = [IPThrottle]
          queryset = models.Book.objects.all()
          serializer_class = BookModelSerializer
          pagination_class = MYLimitOffsetPagination
      
      主站蜘蛛池模板: 日韩精品中文字幕有码| 大地资源免费视频观看| 久久丁香五月天综合网| 国产精品青草久久久久福利99| 欧美做受视频播放| 亚洲精品免费一二三区| 制服丝袜美腿一区二区| 国产成人久久精品一区二区| av无码精品一区二区三区四区| 色欲AV无码一区二区人妻| 四虎www永久在线精品| 最新精品国偷自产在线美女足| 精品国产成人国产在线观看| 国产精品午夜福利视频| 亚洲人成电影网站 久久影视| 亚洲综合无码一区二区三区不卡| 日本一区二区三本视频在线观看| 亚洲熟妇自偷自拍另欧美| 精品一卡2卡三卡4卡乱码精品视频| 成码无人AV片在线电影网站| 精品无码国产污污污免费| 中文国产不卡一区二区| 国产99青青成人A在线| 国产极品粉嫩尤物一区二区| 少妇人妻av无码专区| 任我爽精品视频在线播放| 欧洲无码一区二区三区在线观看| 国产成人亚洲精品在线看| 亚洲αⅴ无码乱码在线观看性色| 国产一区二区三区色噜噜| 日本一区二区三区专线| 国产成AV人片久青草影院| 亚洲人成网站77777在线观看| 国产亚洲精品AA片在线爽| 亚洲综合色网一区二区三区| 精人妻无码一区二区三区| 国产色视频一区二区三区| 久久午夜夜伦鲁鲁片免费无码| аⅴ天堂中文在线网| 插入中文字幕在线一区二区三区| 竹菊影视欧美日韩一区二区三区四区五区|