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)
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_
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
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_)
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
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_)
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