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

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

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

      django restframework框架四 截流

      @(python之路)[django restframework框架四 截流]
      django restframework框架四 截流

      截流簡介

      ?用戶的訪問頻率控制。我們把一個人訪問的事件按戳添加列表中,或者是根據(jù)ip計數(shù)。例如:一分鐘訪問三次,過一分鐘pop一次。

      截流組件

      這里我們把截流組件拿出來。以后用得時候可以直接導(dǎo)入取用。
      我們寫的也是參考源碼。

      
      from rest_framework.throttling import SimpleRateThrottle
      
      class UserRateThrottle(SimpleRateThrottle):
          scope = 'user'
          def get_cache_key(self, request, view):
              if request.user:
                  # 如果已經(jīng)登錄,pk
                  ident = request.user
              else:
                  # 如果沒有登錄,IP
                  ident = self.get_ident(request)
              # 'throttle_%(scope)s_%(ident)s'
              #  throttle_user_fengfeng
              return self.cache_format % {
                  'scope': self.scope,
                  'ident': ident
              }
      
          def allow_request(self, request, view):
              if request.auth.user.user_type == 1:
                  # self.num_requests = 3
                  # self.duration = 60
                  pass
              else:
                  self.num_requests = 6
              return super(UserRateThrottle,self).allow_request(request, view)
      

      配置文件添加
      添加如下這行:

      
      # 此緩存將內(nèi)容保存至文件
      # 配置:
      
      CACHES = {
          'default': {
              'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',
              'LOCATION': '/var/tmp/django_cache',
          }
      }
      # 注:其他配置同開發(fā)調(diào)試版本
      
      
      REST_FRAMEWORK = {
          
          'DEFAULT_THROTTLE_RATES':{
              'user':'3/m'
          },
      }
      
      

      在調(diào)用緩存得時候,是調(diào)用得源碼中

      def allow_request(self, request, view):
          if self.rate is None:
              return True
      
          self.key = self.get_cache_key(request, view)
          if self.key is None:
              return True
      	# 這里我們得history開始時空列表,隨著用戶得訪問,我們將用戶得時間戳添加近列表;
      	# 等過一定時間,pop調(diào)一個。
          self.history = self.cache.get(self.key, [])
          self.now = self.timer()
          while self.history and self.history[-1] <= self.now - self.duration:
              self.history.pop()
          if len(self.history) >= self.num_requests:
              return self.throttle_failure()
          return self.throttle_success()
      
      

      注意:這不是絕對得限制,我們可以針對注冊用戶做限制,匿名用戶只能做,ip限制。限制也不是絕對得。
      緩存配置文件

      源碼分析

      我們 還是從dispatch進入主流程,看他的initial.
      1

       def initial(self, request, *args, **kwargs):
              self.format_kwarg = self.get_format_suffix(**kwargs)
              neg = self.perform_content_negotiation(request)
              request.accepted_renderer, request.accepted_media_type = neg
              version, scheme = self.determine_version(request, *args, **kwargs)
              request.version, request.versioning_scheme = version, scheme
              self.perform_authentication(request)
              self.check_permissions(request)
              # 截流頻率
              self.check_throttles(request)
      

      ?這里就是截流具體要做的東西self.check_throttles(request),具體是怎么做的,我們接著看。
      2

      def check_throttles(self, request):
           for throttle in self.get_throttles():
      	     # 是否允許訪問(allow_request)。如果不允許訪問,就會拋出異常。
               if not throttle.allow_request(request, self):
      	         # 我們注意的是throttle.wait() 他是提示多久以后才可以訪問
                   self.throttled(request, throttle.wait())
      

      這里的self.get_throttles()還是個列表生成式,在里面self.throttle_classes這里邊有它的默認配置。

      throttle_classes = api_settings.DEFAULT_THROTTLE_CLASSES
      

      在我們使用的時候需要導(dǎo)入

      from rest_framework.throttling import BaseThrottle
      

      源碼分析:
      3

      class BaseThrottle(object):
          def allow_request(self, request, view):
      	    pass
          def get_ident(self, request):
              xff = request.META.get('HTTP_X_FORWARDED_FOR')
              remote_addr = request.META.get('REMOTE_ADDR')
      		    ……
          def wait(self):
      		pass
      

      HTTP_X_FORWARDED_FOR這里拿的是請求相關(guān)信息。
      REMOTE_ADDR拿的是ip。
      4

      # 匿名
      class AnonRateThrottle(SimpleRateThrottle)
      
      # 用戶
      class UserRateThrottle(SimpleRateThrottle)
      
      # 范圍
      class ScopedRateThrottle(SimpleRateThrottle)
      

      例子:

      from rest_framework.throttling import SimpleRateThrottle
      class UserView(APIView):
          authentication_classes = [MyAuthtication,]
          throttle_classes = [BaseThrottle,]
          def get(self,request,*args,**kwargs):
              self.dispatch
              return HttpResponse("get")
          def post(self,request,*args,**kwargs):
              return HttpResponse("post")
          def put(self,request,*args,**kwargs):
              return HttpResponse("put")
          def delete(self,request,*args,**kwargs):
              return HttpResponse("delete")
      

      ?當我們這么做的時候(throttle_classes = [BaseThrottle,]),他會先做一步實例化。具體請看2他是這樣做的實例化。他會執(zhí)行__init__.py具體看一下:

      class SimpleRateThrottle(BaseThrottle):
          cache = default_cache
          timer = time.time
          cache_format = 'throttle_%(scope)s_%(ident)s'
          scope = None
          
          # DEFAULT_THROTTLE_RATES 定義訪問頻率的。
          THROTTLE_RATES = api_settings.DEFAULT_THROTTLE_RATES
          def __init__(self):
      	   
              if not getattr(self, 'rate', None):
                  # 這里我們要具體分析get_rate具體做了什么。
                  self.rate = self.get_rate()
              self.num_requests, self.duration = self.parse_rate(self.rate)
          def get_rate(self):
              if not getattr(self, 'scope', None):
                  msg = ("You must set either `.scope` or `.rate` for '%s' throttle" %
                         self.__class__.__name__)
                  raise ImproperlyConfigured(msg)
      
              try:
      	        # 找到我們的scope,scope=None
                  return self.THROTTLE_RATES[self.scope]
              except KeyError:
                  msg = "No default throttle rate set for '%s' scope" % self.scope
                  raise ImproperlyConfigured(msg)
      

      根據(jù)他在配置文件中添加得user:1/3我們可以分析它的源碼

      class SimpleRateThrottle(BaseThrottle):
          def parse_rate(self, rate):
              """
              Given the request rate string, return a two tuple of:
              <allowed number of requests>, <period of time in seconds>
              """
              if rate is None:
                  return (None, None)
              num, period = rate.split('/')
              num_requests = int(num)
              duration = {'s': 1, 'm': 60, 'h': 3600, 'd': 86400}[period[0]]
              return (num_requests, duration)
      

      他是在這里做的處理;具體流程我們還需要在SimpleRateThrottle類中具體看一下,這里不叫簡單不在做詳細得解釋。
      若有不懂得同學(xué),可以留言。

      posted @ 2018-06-04 14:56  zz小公子  閱讀(163)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 成年人尤物视频在线观看| 国产精品自在线拍国产手青青机版| 日韩欧美aⅴ综合网站发布| 色一情一乱一区二区三区码| 伊人久久大香线焦av综合影院| 亚洲精品成人网久久久久久| 国产精品亚洲中文字幕| 精品无码av无码免费专区| 亚洲国产高清av网站| 99热国产这里只有精品9| 欧美激情在线播放| 亚欧洲乱码视频一二三区| 免费无码成人AV片在线| 久久在线视频免费观看| 国产高清国产精品国产专区| 99久久er热在这里只有精品99| 国产亚洲精品第一综合另类无码无遮挡又大又爽又黄的视频 | WWW丫丫国产成人精品| 一区二区三区无码视频免费福利| 日韩不卡一区二区在线观看| 国产99视频精品免费专区| 亚洲av永久无码精品网站| 久青草国产在视频在线观看| 免费人成再在线观看网站| 久热天堂在线视频精品伊人| 天堂网国产| 久久综合综合久久高清免费| 少妇一边呻吟一边说使劲视频| 亚洲一区二区三区黄色片| 国产老妇伦国产熟女老妇高清| 亚洲日韩精品无码一区二区三区 | 六十路老熟妇乱子伦视频| 国产情侣激情在线对白| 私人毛片免费高清影视院| 九九热在线视频精品免费| 一卡2卡三卡4卡免费网站| 国产91久久精品一区二区| 57pao成人国产永久免费视频 | 午夜视频免费试看| 草草线在成年免费视频2| 国产精品一区二区三区91|