def get_house_index(): """获取主页幻灯片展示的房屋基本信息""" # 从缓存中尝试去除数据 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") # 因为redis中保存的是json字符串,所以直接进行字符串拼接返回 return '{"errno":0, "errmsg":"OK", "data":%s}' % ret, 200, {"Content-Type": "application/json"} # 查询数据库,返回房屋订单数目最多的5条数据 try: houses = House.query.order_by(House.order_count.desc()).limit(contants.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='暂无数据') # 如果房屋未设置主图片,则跳过 house_list = [] for house in houses: if not house.index_image_url: continue house_list.append(house.to_basic_dict()) houses_json = json.dumps(house_list) try: redis_store.setex('home_page_data', contants.HOME_PAGE_DATA_REDIS_EXPIRES, houses_json) except Exception as e: current_app.logger.error(e) # 将数据转换为json,并保存到redis缓存 return '{"errno":0,"errmsg":"OK",data:%s}' % houses_json, 200, '{"Content-Type:"application/json"}'
def get_areas(): """获取城区信息""" # 尝试从redis中获取城区信息 try: areas_json = redis_store.get('areas_info') except Exception as e: current_app.logger.error(e) if areas_json is None: # 从数据库获取城区信息 try: areas = Area.query.all() except Exception as e: current_app.logger.error(e) return jsonify(errno=RET.DBERR, errmsg='数据库连接异常') area_dict = [] for area in areas: area_dict.append(area.to_dict_area()) areas_json = json.dumps(area_dict) # 存储到redis中 try: redis_store.setex('areas_info', contants.AREAS_REDIS_EXPIRES, value=areas_json) except Exception as e: current_app.logger.error(e) else: # 表示redis中有缓存,直接使用的是缓存数据 areas_json = areas_json.decode("utf-8") current_app.logger.info("hit redis cache area info") return '{"errno": 0, "errmsg": "查询城区信息成功", "data":{"areas": %s}}' % areas_json, 200, { "Content-Type": "application/json"}
def get_image_code(image_code_id): """获取图片验证码 :param image_code_id:图片验证码编号 :return 正常:验证码图片 异常:返回json """ # 提取参数 # 检验参数 # 1. 业务逻辑处理 # 1.1 生成验证码图片 # 名字 真实文本 图片数据 name, text, image_data = captcha.generate_captcha() # 1.2 将验证码真实值和编码保存到redis中,设置有效期 # Redis 数据类型:字符串 列表 哈希 集合 有序集合 # 'key':xxx # 使用哈希维护有效期的时候只能整体设置 # 'image_code':['编号1':'真实值1','编号2':'真实值2'] 哈希 hset('image_codes','id1','abc) hget('image_codes','id1') # 单条维护记录,选用字符串类型 # 'image_code_编号':'真实值' try: # redis_store.set('image_code_%s' % image_code_id, text) # redis_store.expire('image_code_%s' % image_code_id, contants.IMAGE_CODE_REDIS_EXPIRES) redis_store.setex('image_code_%s' % image_code_id, time=contants.IMAGE_CODE_REDIS_EXPIRES, value=text) except Exception as e: # 记录日志 current_app.logger.error(e) return jsonify(errno=RET.DBERR, errmsg='save image code id failed') # 返回值 # 1.3 返回图片 resp = make_response(image_data) resp.headers['Content-Type'] = 'image/jpg' return resp
def set_user_name(): """设置用户名 @:param 用户名称、用户ID(g对象) """ user_id = g.user_id req_dict = request.get_json() user_name = req_dict.get('name') if not all((user_name, )): return jsonify(errno=RET.PARAMERR, errmsg='用户名称不能为空') try: user = User.query.filter_by(id=user_id).first() except Exception as e: current_app.logger.error(e) return jsonify(errno=RET.DBERR, errmsg='获取用户信息失败') if user is None: return jsonify(errno=RET.USERERR, errmsg='用户不存在,请退出重试') user.name = user_name try: db.session.add(user) db.session.commit() except IntegrityError as e: db.session.rollback() current_app.logger.error(e) return jsonify(errno=RET.DATAEXIST, errmsg='用户名称已存在,请重新输入') except Exception as e: db.session.rollback() current_app.logger.error(e) return jsonify(errno=RET.DBERR, errmsg='数据库错误') redis_store.setex('user_name_%s' % user_id, time=contants.USER_NAME_REDIS_EXPIRES, value=user_name) session['name'] = user_name return jsonify(errno=RET.OK, errmsg='保存成功')
def get_house_detail(house_id): """获取房屋详情""" # 前端在房屋详情页面展示时,如果浏览页面的用户不是该房屋的房东,则展示预定按钮,否则不展示, # 所以需要后端返回登录用户的user_id # 尝试获取用户登录的信息,若登录,则返回给前端登录用户的user_id,否则返回user_id=-1 user_id = session.get("user_id", "-1") # 校验参数 if not house_id: return jsonify(errno=RET.PARAMERR, errmsg="参数错误") # 先从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 info redis") return '{"errno":"0", "errmsg":"OK", "data":{"user_id":%s, "house":%s}}' % (user_id, ret), 200, { "Content-Type": "application/json"} # 查询数据库 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 = bytes.decode(house.to_full_dict()) except Exception as e: current_app.logger.error(e) return jsonify(errno=RET.DATAERR, errmsg="数据出错") # 存入到redis中 json_house = json.dumps(house_data) try: redis_store.setex("house_info_%s" % house_id, contants.HOUSE_DETAIL_REDIS_EXPIRE_SECOND, json_house) except Exception as e: current_app.logger.error(e) resp = '{"errno":"0", "errmsg":"OK", "data":{"user_id":%s, "house":%s}}' % (user_id, json_house), 200, { "Content-Type": "application/json"} return resp
def get_sms_code(mobile): """获取短信验证码""" # 获取参数 image_code = request.args.get('image_code') image_code_id = request.args.get('image_code_id') # 校验参数 if not all((image_code_id, image_code)): # 表示参数不完整 return jsonify(error=RET.PARAMERR, errmsg='参数不完整') # 业务逻辑处理 # 1. 从redis中取出真实图片验证码 try: real_image_code = redis_store.get('image_code_%s' % image_code_id) except Exception as e: current_app.logger.error(e) return jsonify(errno=RET.DBERR, errmsg='redis数据库异常') if real_image_code is None: # 图片验证码没有或者过期 return jsonify(errno=RET.NODATA, errmsg='图片验证码失效') # 2. 进行对比 if real_image_code.decode("utf-8").lower() != image_code.lower(): return jsonify(errno=RET.DATAERR, errmsg='图片验证码错误') # 删除redis中的图片验证码,防止用户使用同一个图片验证码验证多次 try: redis_store.delete('image_code_%s' % image_code_id) except Exception as e: current_app.logger.error(e) # 判断对于这个手机号的操作,在60秒内有没有之前的记录,如果有,则认为用户操作频繁,不处理 try: send_flag = redis_store.get('send_sms_code_%s' % mobile) except Exception as e: current_app.logger.error(e) else: if send_flag is not None: return jsonify(errno=RET.REQERR, errmsg='请求过于频繁') # 3. 校验手机号是否存在 try: user = User.query.filter_by(mobile=mobile).first() except Exception as e: current_app.logger.error(e) return jsonify(errno=RET.DBERR, errmsg='mysql数据库异常') else: if user is not None: return jsonify(errno=RET.DATAEXIST, errmsg='手机号已经被注册') # 4. 生成短信验证码 sms_code = "%06d" % random.randint(100000, 999999) # 5. 保存真实验证码 try: redis_store.setex('sms_code_%s' % mobile, contants.SMS_CODE_REDIS_EXPIRES, sms_code) # 保存发送给这个手机号的记录,防止用户在60秒内再次触发发送短信操作 redis_store.setex('send_sms_code_%s' % mobile, contants.SEND_SMS_CODE_INTERVAL, 1) except Exception as e: current_app.logger.error(e) return jsonify(errno=RET.DBERR, errmsg='保存短信验证码异常') # 6. 发送 result = tasks.send_template_sms.delay(mobile, [sms_code, int(contants.SMS_CODE_REDIS_EXPIRES / 60)], 1) # ccp = CCP() # try: # result = ccp.send_template_sms(mobile, [sms_code, int(contants.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='发送失败') # get 方法默认是阻塞行为,会等到有结果才返回 # get 方法可以设置参数timeout,超时时间,如果超时则返回 ret = result.get() current_app.logger.info(ret) return jsonify(errno=RET.OK, errmsg="发送成功")