def post(self): # 获取参数 parser = RequestParser() parser.add_argument('mobile', type=type_mobile, required=True, location='json') parser.add_argument('code', type=regex(r'^\d{6}$'), required=True, location='json') args = parser.parse_args() mobile = args.mobile code = args.code # 校验短信验证码 key = "app:code:{}".format(mobile) try: real_code = current_app.redis_master.get(key) except BaseException as e: current_app.logger.error(e) # 记录日志 real_code = current_app.redis_slave.get( key) # 如果主数据库连接失败, 再到数据库中获取 # 一旦取出, 验证码就要删除 (验证码只能使用一次) # try: # current_app.redis_master.delete(key) # except BaseException as e: # current_app.logger.error(e) if not real_code or real_code.decode() != code: return {'message': "Invalid code", "data": None}, 400 # 到数据库中查询该用户 user = User.query.filter_by(mobile=mobile).first() if not user: # 如果没有, 生成一条新的用户数据 # 生成分布式id user_id = current_app.id_worker.get_id() # 添加user记录 user = User(id=user_id, mobile=mobile, name=mobile, last_login=datetime.now()) db.session.add(user) # 添加user_profile记录 user_profile = UserProfile(id=user_id) db.session.add(user_profile) else: user.last_login = datetime.now() user_id = user.id db.session.commit() # 记录用户状态, 生成jwt access_token, refresh_token = self._generate_tokens(user_id) # 返回json数据 return {'access_token': access_token, "refresh_token": refresh_token}
async def on_turn(self, context: TurnContext, logic: Callable[[TurnContext], Awaitable]): context_user_id = context.activity.from_property.id if context_user_id.isdigit(): await context.send_activity(f'Valid UserId: {context_user_id}') user_profile = UserProfile() user_profile.user_id = context_user_id context.turn_state['user_profile'] = user_profile await logic()
def post(self): """ 登录创建token """ json_parser = RequestParser() json_parser.add_argument('mobile', type=parser.mobile, required=True, location='json') json_parser.add_argument('code', type=parser.regex(r'^\d{6}$'), required=True, location='json') args = json_parser.parse_args() mobile = args.mobile code = args.code # 从redis中获取验证码 key = 'app:code:{}'.format(mobile) try: real_code = current_app.redis_master.get(key) except ConnectionError as e: current_app.logger.error(e) real_code = current_app.redis_slave.get(key) try: current_app.redis_master.delete(key) except ConnectionError as e: current_app.logger.error(e) if not real_code or real_code.decode() != code: return {'message': 'Invalid code.'}, 400 # 查询或保存用户 user = User.query.filter_by(mobile=mobile).first() if user is None: # 用户不存在,注册用户 # 雪花算法生成一个分布式ID user_id = current_app.id_worker.get_id() user = User(id=user_id, mobile=mobile, name=mobile, last_login=datetime.now()) db.session.add(user) profile = UserProfile(id=user.id) db.session.add(profile) db.session.commit() else: if user.status == User.STATUS.DISABLE: return {'message': 'Invalid user.'}, 403 token, refresh_token = self._generate_tokens(user.id) return {'token': token, 'refresh_token': refresh_token}, 201
def test_create_profile_missing_fields(self): user = self.register_user() payload = { "photoFsRef": "https://google.com", "coverPhotoFsRef": "https://google.com", "tagline": "Some Tagline", "user_id": user.id } profile = UserProfile(**payload) profile.save() self.assertEqual(1, profile.id)
def test_create_profile(self): user = self.register_user() payload = { "photoFsRef": "https://google.com", "coverPhotoFsRef": "https://google.com", "tagline": "Some Tagline", "short_bio": "Short Bio", "country": "PH", "user_id": user.id } profile = UserProfile(**payload) profile.save() self.assertEqual(1, profile.id)
def post(self): """登录、注册创建token(JWT)""" """接收参数、校验参数""" # 验证手机号、验证码 rep = reqparse.RequestParser() rep.add_argument('mobile', required=True, type=parser.moblie, location='json') rep.add_argument('code', required=True, type=inputs.regex(r'^\d{6}$'), location='json') # 启用验证并获取校验后的参数 args = rep.parse_args() mobile = args.mobile code = args.code print('获取的手机号为:', mobile) print('获取的验证码为:', code) """数据处理""" # 根据mobile组合成key,去redis中取code key = f"app:code:{mobile}" try: # 先从主中获取,主里面没有再去从里尝试获取 real_code = current_app.redis_master.get(key) except ConnectionError as err: current_app.logger(err) print(err) print('主Redis中并没有找到code,开始尝试从从Redis中获取。') real_code = current_app.redis_slave.get(key) # 不管有没有,先删除code,保证验证码只能使用一次 try: current_app.redis_master.delete(key) except ConnectionError as err: current_app.logger(err) print('因为Redis中只有主可以进行写操作,所以可能从从中删除', err) # 如果Code不正确,直接返回错误信息 if (not real_code) or (code != real_code.decode()): return {'message': '验证码无效'}, 400 # 正确的话开始判断用户是否存在 user = User.query.filter(User.mobile == mobile).first() # 如果用户不存在注册用户 if not user: user_id = current_app.id_worker.get_id() user = User(id=user_id, mobile=mobile, name=mobile, last_login=datetime.now()) db.session.add(user) user_profile = UserProfile(id=user_id) db.session.add(user_profile) db.session.commit() else: if user.status == User.STATUS.DISABLE: print('用户已经被禁用') return {'message': '用户已经被禁用'}, 403 print('用户正常,开始获取JWT。') token, refresh_token = self._generate_tokens(user.id) print('token:', token) print('refresh_token:', refresh_token) """返回响应""" return {'token': token, 'refresh_token': refresh_token}, 201