def get_img_code(): # 获取参数 cur = request.args.get("cur") # 验证码编号 pre = request.args.get("pre") # 上次验证码编号 # 参数校验 if not cur: return abort(403) # 403 表示服务器拒绝访问 # 生成图片验证码(图片+文字) img_name, img_text, img_bytes = captcha.generate_captcha() # 保存验证码文字和图片key redis 方便设置过期时间,性能也好,键值关系满足需求 try: if pre: sr.delete("image_code_id" + pre) sr.set("image_code_id" + cur, img_text, ex=IMAGE_CODE_REDIS_EXPIRES) except BaseException as e: current_app.logger.error(e) # 记录错误信息 return abort(500) # (服务器内部错误)服务器遇到错误,无法完成请求 # 返回图片 自定义响应对象 response = make_response(img_bytes) # type:Response # 设置响应头 response.content_type = "image/jpeg" return response
def get_image_code(): """ 1. 获取传入的验证码编号,并编号是否有值 2. 生成图片验证码 3. 保存编号和其对应的图片验证码内容到redis 4. 返回验证码图片 :return: """ # current_app.logger.error("error log") # 1. 获取传入的验证码编号,并编号是否有值 args = request.args cur = args.get("cur") pre = args.get("pre") if not cur: abort(403) # 2. 生成图片验证码 _, text, image = captcha.generate_captcha() current_app.logger.debug(text) # 3. 保存编号和其对应的图片验证码内容到redis try: # 删除之前保存的数据 sr.delete("ImageCode_" + pre) sr.set("ImageCode_" + cur, text, constants.IMAGE_CODE_REDIS_EXPIRES) except Exception as e: current_app.logger.error(e) # 保存出现错误,返回JSON数据提示错误 return jsonify(errno=RET.DBERR, errmsg="保存验证码失败") # 4. 返回验证码图片 response = make_response(image) response.headers["Content-Type"] = "image/jpg" return response
def order_comment(): """ 订单评价 1. 获取参数 2. 校验参数 3. 修改模型 :return: """ # 1. 获取参数 data_json = request.json order_id = data_json.get("order_id") comment = data_json.get("comment") # 2. 2. 校验参数 if not all([order_id, comment]): return jsonify(errno=RET.PARAMERR, errmsg="参数错误") try: order = Order.query.filter(Order.id == order_id, Order.status == "WAIT_COMMENT").first() except Exception as e: current_app.logger.error(e) return jsonify(errno=RET.DBERR, errmsg="查询数据错误") if not order: return jsonify(errno=RET.NODATA, errmsg="该订单不存在") # 3. 修改模型并且保存到数据库 order.comment = comment order.status = "COMPLETE" try: db.session.commit() except Exception as e: db.session.rollback() current_app.logger.error(e) return jsonify(errno=RET.DBERR, errmsg="保存数据失败") # 删除房屋详情信息缓存 try: sr.delete("house_detail_%d" % order.house_id) except Exception as e: current_app.logger.error(e) # 4. 返回结果 return jsonify(errno=RET.OK, errmsg="ok")
def order_comment(): """ 订单评价 1. 获取参数 2. 校验参数 3. 修改模型 :return: """ # 1.获取参数 param_dict = request.get_json() comment = param_dict.get("comment") order_id = param_dict.get("order_id") user_id = g.user_id # 2.校验参数 if not comment: return jsonify(errno=RET.PARAMERR, errmsg="参数不足") # 查询订单,确保用户只能评价自己的订单并且订单处于待评价的状态 try: order = Order.query.filter(Order.id == order_id, Order.user_id == user_id, Order.status == "WAIT_COMMENT").first() house_id = order.house_id # 根据订单房屋id查询房屋对象 house = House.query.get(house_id) except Exception as e: current_app.logger.error(e) return jsonify(errno=RET.DBERR, errmsg="查询订单异常") if not order: return jsonify(errno=RET.NODATA, errmsg="订单不存在") # 3.修改模型 # 保存评价信息 order.comment = comment # 将订单的状态设置为已完成 order.status = "COMPLETE" # 将房屋完成订单数加1 house.order_count += 1 # 4.保存到数据库 try: db.session.add(order) db.session.add(house) db.session.commit() except Exception as e: current_app.logger.error(e) db.session.rollback() return jsonify(errno=RET.DBERR, errmsg="保存评价异常") # 为了在房屋详情中显示最新的评价信息,所以需要删除redis中该订单对应的房屋的信息 try: sr.delete("house_info_%s" % order.house_id) except Exception as e: current_app.logger.error(e) return jsonify(errno=RET.DBERR, errmsg="删除redis中该订单对应的房屋的信息异常") # 5.返回 return jsonify(errno=RET.OK, errmsg="OK")
def send_sms(): """ 1. 接收参数并判断是否有值 2. 校验手机号是正确 3. 通过传入的图片编码去redis中查询真实的图片验证码内容 4. 进行验证码内容的比对 5. 生成发送短信的内容并发送短信 6. redis中保存短信验证码内容 7. 返回发送成功的响应 :return: """ # 1. 接收参数并判断是否有值 # 取到请求值中的内容 data = request.data data_dict = json.loads(data) mobile = data_dict.get("mobile") image_code = data_dict.get("image_code") image_code_id = data_dict.get("image_code_id") if not all([mobile, image_code_id, image_code]): return jsonify(errno=RET.PARAMERR, errmsg="参数不全") # 2. 校验手机号是正确 if not re.match("^1[3578][0-9]{9}$", mobile): return jsonify(errno=RET.PARAMERR, errmsg="手机号格式不正确") # 3. 通过传入的图片编码去redis中查询真实的图片验证码内容 try: real_image_code = sr.get("ImageCode_" + image_code_id) # 如果能够取出来值,删除redis中缓存的内容 if real_image_code: sr.delete("ImageCode_" + image_code_id) except Exception as e: current_app.logger.error(e) return jsonify(errno=RET.DBERR, errmsg="获取图片验证码失败") # 3.1 判断验证码是否存在,已过期 if not real_image_code: return jsonify(errno=RET.NODATA, errmsg="验证码已过期") # 4. 进行验证码内容的比对 if image_code.lower() != real_image_code.lower(): return jsonify(errno=RET.DATAERR, errmsg="验证码输入错误") # 4.1 校验该手机是否已经注册 try: user = User.query.filter_by(mobile=mobile).first() except Exception as e: user = None # 如果查询时出现错误,也需要给user初始化,如果不初始化,会报未定义的异常 current_app.logger.error(e) if user: return jsonify(errno=RET.DATAEXIST, errmsg="该手机已被注册") # 5. 生成发送短信的内容并发送短信 result = random.randint(0, 999999) sms_code = "%06d" % result current_app.logger.debug("短信验证码的内容:%s" % sms_code) # result = CCP().send_template_sms(mobile, [sms_code, constants.SMS_CODE_REDIS_EXPIRES / 60], "1") # if result != 1: # return jsonify(errno=RET.THIRDERR, errmsg="发送短信失败") # 6. redis中保存短信验证码内容 try: sr.set("SMS_" + mobile, sms_code, constants.SMS_CODE_REDIS_EXPIRES) except Exception as e: current_app.logger.error(e) return jsonify(errno=RET.DBERR, errmsg="保存短信验证码失败") # 7. 返回发送成功的响应 return jsonify(errno=RET.OK, errmsg="发送成功")