def get_code_by_sms(request, tel): """获取短信验证码""" if check_tel(tel): if caches['default'].get(f'{tel}:block'): resp = DefaultResponse(*CODE_TOO_FREQUENCY) else: code = gen_mobile_code() message = f'您的短信验证码是{code},打死也不能告诉别人哟!【Python小课】' send_sms_by_luosimao.apply_async((tel, message), countdown=random.random() * 5) caches['default'].set(f'{tel}:block', code, timeout=120) caches['default'].set(f'{tel}:valid', code, timeout=1800) resp = DefaultResponse(*MOBILE_CODE_SUCCESS) else: resp = DefaultResponse(*INVALID_TEL_NUM) return resp
def login(request): """登录(获取用户身份令牌)""" username = request.data.get('username') password = request.data.get('password') if (check_tel(username) or check_email(username) or check_username(username)) and len(password) >= 6: password = to_md5_hex(password) q = Q(username=username, password=password) | \ Q(tel=username, password=password) | \ Q(email=username, password=password) user = User.objects.filter(q)\ .only('username', 'realname').first() if user: if user.status: # 用户登录成功通过JWT生成用户身份令牌 payload = { 'exp': datetime.datetime.utcnow() + datetime.timedelta(days=1), 'data': { 'userid': user.userid, 'realname': user.realname, 'roleid': user.roles.get_queryset().first().roleid } } token = jwt.encode(payload, SECRET_KEY, algorithm='HS256').decode() with atomic(): current_time = timezone.now() if not user.lastvisit or \ (current_time - user.lastvisit).days >= 1: user.point += 2 user.lastvisit = current_time user.save() loginlog = LoginLog() loginlog.user = user loginlog.logdate = current_time loginlog.ipaddr = get_ip_address(request) loginlog.save() resp = DefaultResponse(*USER_LOGIN_SUCCESS, data={'token': token}) else: resp = DefaultResponse(*USER_LOGIN_STATUS) else: resp = DefaultResponse(*USER_LOGIN_FAILED) else: resp = DefaultResponse(*INVALID_LOGIN_INFO) return resp
def get_code_by_sms(request, tel): if check_tel(tel): if caches['default'].get(f'{tel}:block'): res = DefaultResponse(*CODE_TOO_FREQUENCY) else: code = gen_mobile_code() time.sleep(random.random() * 10) message = f'您的短信验证码为{code}, 如非本人操作请忽略【铁壳网络】' print(message) # 成为消息的生产者,并将任务加入队列 # send_sms_by_luosimao.apply_async((message, tel), countdown=random.random() * 10) caches['default'].set(f'{tel}:block', code, timeout=120) caches['default'].set(f'{tel}:valid', code, timeout=1800) res = DefaultResponse(*MOBILE_CODE_SUCCESS) else: res = DefaultResponse(*INVALID_TEL_NUM) return res