Пример #1
0
 def decr_viewcount(self):
     cache_key = self._remaining_viewcount_by_student_cache_key % self.id
     if rd.get(cache_key):
         viewcount = int(rd.get(cache_key))
         if viewcount <= 0:
             raise CannotViewPostContactError()
         rd.decr(cache_key)
Пример #2
0
 def _get_pv(self):
     key = self._post_pv_by_id_cache_key % self.id
     cached = int(rd.get(key)) if rd.get(key) else None
     if cached is not None:
         return cached
     rd.set(key, self.pv_)
     return self.pv_
Пример #3
0
 def remaining_viewcount(self):
     cache_key = self._remaining_viewcount_by_student_cache_key % self.id
     if rd.get(cache_key):
         viewcount = int(rd.get(cache_key))
         return viewcount
     else:
         rd.set(cache_key, self.MAX_VIEWCOUNT)
         rd.expire(cache_key, ONE_DAY)
         return self.MAX_VIEWCOUNT
Пример #4
0
 def test_verify(self):
     mobile = '13600000000'
     type_ = SMSVerifyType.register
     v = SMSVerify.add(mobile, type_)
     assert v
     redis_key = SMSVerify._redis_key.format(mobile=mobile,
                                             type_=type_.value)
     assert v == rd.get(redis_key)
     assert SMSVerify.verify(mobile, v, type_)
Пример #5
0
    def add(cls, mobile, type_, max_send_total=5):
        total_send_key = cls._total_send_key.format(mobile=mobile,
                                                    type_=type_.value)
        total_send = int(
            rd.get(total_send_key)) if rd.get(total_send_key) else 0
        # if total_send and total_send >= max_send_total:
        #     raise SendSMSTooManyTimesError(
        #         '已超出当日最大获取验证码次数,请24小时后尝试')

        code = cls._gen_verify_code()
        key = cls._redis_key.format(mobile=mobile, type_=type_.value)
        existed = rd.get(key)
        if existed:
            rd.delete(key)
        rd.set(key, code)
        rd.expire(key, cls._expire_time)

        rd.incr(total_send_key)
        if not total_send:
            rd.expire(total_send_key, ONE_DAY)
        return code
Пример #6
0
 def test_verify_retry(self):
     mobile = '13600000000'
     type_ = SMSVerifyType.register
     v = SMSVerify.add(mobile, type_)
     assert v
     redis_key = SMSVerify._redis_key.format(mobile=mobile,
                                             type_=type_.value)
     assert v == rd.get(redis_key)
     for i in range(5):
         assert not SMSVerify.verify(mobile, v + '1', type_)
     with pytest.raises(AtemptTooManyTimesError):
         SMSVerify.verify(mobile, v + '1', type_)
Пример #7
0
 def verify(cls, mobile, code, type_, max_retry=5):
     key = cls._redis_key.format(mobile=mobile, type_=type_.value)
     total_retry_key = cls._total_retry_key.format(mobile=mobile,
                                                   type_=type_.value)
     # retry_total = int(rd.get(total_retry_key)) if rd.get(total_retry_key) else 0
     # if retry_total >= max_retry:
     #     rd.delete(key)
     #     rd.delete(total_retry_key)
     #     raise AtemptTooManyTimesError('验证码错误输入次数过多,请重新获取')
     cached_code = rd.get(key)
     if cached_code == str(code):
         rd.delete(key)
         rd.delete(total_retry_key)
         return True
     rd.incr(total_retry_key)
     return False