def get_area_info(): ''' 获取区域信息: 缓存-磁盘-缓存 1. 尝试从redis中获取缓存数据信息 2. 获取区域信息, 发送异常就将其置为None 3. 判断获取结果 4. 留下访问记录 5. 缓存中的区域信息 已经是json 可以直接返回 6. 查询mysql数据库 7. 校验查询结果 8. 定义容器, 存储查询结果, 遍历区域信息 9. 转换为json 存入redis缓存 10. 返回结果 :return: ''' # 尝试从缓存中获取信息 try: areas = redis_store.get("area_info") except Exception as e: current_app.logger.error(e) # 没有进行返回, 则将其置为None areas = None # 判断获取结果, 留下查询记录 if areas: current_app.logger.info('hit area info redis') return '{"errno": 0, "errmsg": "OK", "data": %s}' % areas # 查询数据库 try: areas = Area.query.all() except Exception as e: current_app.logger.error(e) return jsonify(errno=RET.DBERR, errmsg="查询失败") # 校验查询结果 if not areas: return jsonify(errno=RET.NODATA, errmsg="无信息") # 定义列表 areas_list = [] for area in areas: areas_list.append(area.to_dict()) # 序列化数据, 准备加入缓存 areas_json = json.dumps(areas_list) # 存入redis try: redis_store.setex('area_info', constants.AREA_INFO_REDIS_EXPIRES, areas_json) except Exception as e: current_app.logger.error(e) # 构造响应数据 resp = '{"errno": 0, "errmsg": "OK, "data": %s}' % areas_json # 返回结果 return resp
def get_houses_index(): ''' 获取房屋首页幻灯片信息: 缓存-磁盘-缓存 1. 尝试从redis中获取幻灯片数据 2. 校验结果, 如果有数据, 记录访问时间, 返回结果 3. 查询/mysql数据库 4. 校验结果 5. 定义容器, 遍历存储结果, 判断是否设置房屋主图片, 如果为设置默认不添加 6. 对房屋数据进行序列化 转换为json 7. 对房屋数据存入缓存 8. 返回结果 :return: ''' # 尝试从redis中获取缓存 try: ret = redis_store.get('home_page_data') except Exception as e: current_app.logger.error(e) ret = None # 判断获取结果, 如果有数据, 记录访问时间,返回结果 if ret: current_app.logger.info('hit house index info redis') return '{"errno": 0, "errmsg": "OK", "data": %s}' % ret # 查询mysql数据库 try: # 查询房屋表, 默认按照成交量从高到底排序, 返回五条数据 houses = House.query.order_by(House.order_count.desc()).limit(constants.HOME_PAGE_MAX_HOUSES) except Exception as e: current_app.logger.error(e) return jsonify(errno=RET.DBERR, errmsg="查询失败") # 校验查询结果 if not houses: return jsonify(errno=RET.NODATA, errmsg="无房屋数据") # 定义容器, 遍历查询结果, 添加数据 houses_list = [] # 对房屋主图片是否设置进判断 for house in houses: if not house.index_image_url: continue houses_list.append(house.to_basic_dict()) # 序列化数据 houses_json = json.dumps(houses_list) # 把房屋数据存入缓存 try: redis_store.setex("home_page_data", constants.HOME_PAGE_DATA_REDIS_EXPIRES, houses_json) except Exception as e: current_app.logger.error(e) # 构造响应报文, 返回结果 resp = '{"errno":0, "errmsg":"OK", "data":%s}' % houses_json return resp
def send_msg_code(mobile): ''' *发送短信验证码* 1. 获取参数(mobile, text, id) 2. 校验参数的完整性 3. 校验手机号的正则 4. 从redis缓存中获取真实的图片验证码 5. 判断真实验证码吗的有效期 6. 从redis缓存中删除真实验证码 7. 对比验证码的正确性 8. 生成短信随机数 9. 保存随机码到redis缓存 10. 判断用户是否已经注册 11. 调用接口发送验证码啊 12. 判断发送结果 13. 返回结果 :param mobile: :return: ''' # 获取请求参数 image_code = request.args.get("text") image_code_id = request.args.get("id") # 校验完整性 if not all([mobile, image_code, image_code_id]): return jsonify(errno=RET.PARAMERR, errmsg="参数不完整") # 校验手机号 if not re.match(r'1[3456789]\d{9}$', mobile): return jsonify(errno=RET.PARAMERR, errmsg="手机号格式不正确") # 获取真实验证码 try: real_image_code = redis_store.get("ImageCode_" + image_code_id) except Exception as e: current_app.logger.error(e) return jsonify(errno=RET.DBERR, errmsg="获取验证码斯失败") # 校验获取验证码 if not real_image_code: return jsonify(errno=RET.NODATA, errmsg="验证码过期") # 删除验证码 try: redis_store.delete("ImageCode_" + image_code_id) except Exception as e: current_app.logger.error(e) # 比较验证码是否一致 if real_image_code.lower() != image_code.lower(): return jsonify(errno=RET.DATAERR, errmsg="验证码不正确") # 生成短信随机码 sms_code = "%06d" % random.randint(1, 999999) # 保存随机数 try: redis_store.setex("SMSCode_" + mobile, constants.SMS_CODE_REDIS_EXPIRES, sms_code) except Exception as e: current_app.logger.error(e) return jsonify(errno=RET.DBERR, errmsg="保存随机数失败") # 判断手机号是否注册 try: user = User.query.filter_by(mobile=mobile).first() except Exception as e: current_app.logger.error(e) return jsonify(errno=RET.DBERR, errmsg="查询失败") else: if user: return jsonify(errno=RET.DBERR, errmsg="手机号已经注册") # 调用接口, 发送激活短信 try: ccp = sms.CCP() # 保存发送的结果 result = ccp.send_template_sms( mobile, [sms_code, constants.SMS_CODE_REDIS_EXPIRES / 60], 1) except Exception as e: current_app.logger.error(e) return jsonify(errno=RET.THIRDERR, errmsg="发送短信异常") # 判断发送结果 if result == 0: return jsonify(errno=RET.OK, errmsg="发送成功") else: return jsonify(errno=RET.THIRDERR, errmsg="发送失败")
def register(): ''' *注册用户提交* 1. 获取参数 request.get_json() 2. 校验参数的存在 3. 进一步获取参数信息 user_data.get("") 4. 校验参数的完整性 all() 5. 校验手机号的正则 6. 获取本地存储的真实的短信验证码 7. 校验短信验证码的有效期 8. 对比验证码是否一致 9. 删除redis缓存里的短信验证码 10. 判断是否注册 11. 保存用户信息 12. 加密密码信息 user.password = password 13. 提交到数据库 db..session.add(user) db.session.commit() 出错则进行回滚操作db.sesion.rollback() 14. 将用户信息缓存到session中 session["user_id"] = user.id name mobile 15. 返回结果 额外返回一个 data=user.to_dict() :return: ''' # 获取参数 user_data = request.get_json() # 校验参数存在 if not user_data: return jsonify(errno=RET.PARAMERR, errmsg="参数缺失") # 进一步获取参数 mobile = user_data.get("mobile") smscode = user_data.get("sms_code") password = user_data.get("password") # 校验参数的完整性 if not all([mobile, smscode, password]): return jsonify(errno=RET.PARAMERR, errmsg="参数不完整") # 对手机号进行校验 if not re.match(r'1[3456789]\d{9}', mobile): return jsonify(errno=RET.PARAMERR, errmsg="手机号格式不正确") # 获取本地存储的真实验证码 try: real_sms_code = redis_store.get("SMSCode_" + mobile) except Exception as e: current_app.logger.error(e) return jsonify(errno=RET.DBERR, errmsg="获取失败") # 判断获取的结果 if not real_sms_code: return jsonify(errno=RET.NODATA, errmsg="短信验证码失效") # 比较短信验证码是否一致 if real_sms_code != str(smscode): return jsonify(errno=RET.DATAERR, errmsg="验证码不正确") # 删除redis中存储的短信验证码 try: redis_store.delete("SMSCode_" + mobile) except Exception as e: current_app.logger.error(e) # 判断是否注册 try: user = User.query.filter_by(mobile=mobile).first() except Exception as e: current_app.logger.error(e) return jsonify(errno=RET.DBERR, errmsg="查询失败") else: if user: return jsonify(errno=RET.DATAEXIST, errmsg="用户已经存在") # 保存用户信息 user = User(name=mobile, mobile=mobile) # 加密密码 user.password = password # 提交到数据库 try: db.session.add(user) db.session.commit() except Exception as e: current_app.logger.error(e) db.session.rollback() return jsonify(errno=RET.DBERR, errmsg="保存用户信息失败") # 缓存用户信息到redis缓存中 session['user_id'] = user.id session['name'] = mobile session['mobile'] = mobile # 返回结果 return jsonify(errno=RET.OK, errmsg="OK", data=user.to_dict())
def get_house_detail(house_id): ''' 获取房屋详情数据: 缓存-磁盘-缓存 1. 尝试确认用户身份, 把用户分为两类, 登陆用户获取user_id , 为登陆用户默认为-1 session.get('user_id', "-1") 2. 校验house_id 3. 操作redis数据库, 尝试获取房屋信息 4. 判断获取结果, 如果有数据, 记录访问时间, 返回json数据 5. 查询mysql数据库 6. 校验查询结果, 确认房屋存在 7. 调用模型类中的to_full_dict() 8. 对房屋详情数据进行序列化, 存入redis缓存 9. 构造响应数据 10. 返回结果, user_id和房屋详情数据 :param house_id: :return: ''' # 尝试获取用户身份, 如果为登陆默认-1 user_id = session.get('user_id', "-1") # 校验house_id if not house_id: return jsonify(errno=RET.PARAMERR, errmsg="参数缺失") # 根据house_id, 尝试从redis获取房屋数据 try: ret = redis_store.get('house_info_%s' % house_id) except Exception as e: current_app.logger.error(e) ret = None # 判断获取结果 if ret: current_app.logger.info('hit house detail info redis') return '{"errno": 0, "errmsg": "OK", "data": {"user_id": %s, "house": %s}}' % (user_id, ret) # 查询mysql数据库, 确认房屋存在 try: house = House.query.get(house_id) except Exception as e: current_app.logger.error(e) return jsonify(errno=RET.DBERR, errmsg="查询房屋数据失败") # 校验查询结果 if not house: return jsonify(errno=RET.NODATA, errmsg="无数据") # 调用模型类中的方法, 获取房屋详情数据 try: house_data = house.to_full_dict() except Exception as e: current_app.logger.error(e) return jsonify(errno=RET.DBERR, errmsg="获取房屋详情失败") # 序列化数据 house_json = json.dumps(house_data) # 把房屋详情数据存入到redis缓存里面 try: redis_store.setex('house_info_%s' % house_id, constants.HOUSE_DETAIL_REDIS_EXPIRE_SECOND, house_json) except Exception as e: current_app.logger.error(e) # 构造响应报文 resp = '{"errno":0, "errmsg":"OK", "data":{"user_id":%s, "house":%s}}' % (user_id, house_json) # 返回结果 return resp