Exemplo n.º 1
0
def get_img_code(image_code_id):
    # print '1'
    # 1. 获取参数, 参数通过网址中获取
    # 客户端生成UUID
    # 2. 对参数做完整性校验
    # 如果能进入此路由, 说明一定是传递了参数, 所以不就省去了判断是否为空的判断
    # 3. 处理业务逻辑
    # 3.1 生成验证码
    # 图片名name  验证码内容text  验证码图片(图片二进制文件)image_data
    name, text, image_data = captcha.generate_captcha()
    # print name
    # 3.2 保存到Redis中
    # 保存到数据库的时候, 有可能会出现异常保存不成功, 所以需要try
    try:
        # key--->'image_code_' + image_code_id
        # setex--->set + expire
        # setex中需要传三个参数
        # 第一个参数: key
        # 第二个参数: 过期时间(单位是秒)
        # 第三个参数: value(验证码内容)
        redis_store.setex('image_code_%s' % image_code_id,
                          constants.IMAGE_CODE_REDIS_EXPIRE, text)
    except Exception as e:
        logging.error(e)
        # 返回错误信息
        return jsonify({'errno': RET.DBERR, 'errmsg': '数据库发生异常, 请重试'})
    # 4. 处理返回值 contet-type : text/html --> image/jpg
    response = make_response(image_data)
    response.headers['Content-Type'] = 'image/jpg'
    print response
    return response
Exemplo n.º 2
0
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:
        logging.error(e)
        ret = None
    if ret:
        logging.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:
        logging.error(e)
        return jsonify(errno=RET.DBERR, errmsg="查询数据失败")

    if not house:
        return jsonify(errno=RET.NODATA, errmsg="房屋不存在")

    # 将房屋对象数据转换为字典
    try:
        house_dict = house.to_full_dict()
    except Exception as e:
        logging.error(e)
        return jsonify(errno=RET.DATAERR, errmsg="数据出错")

    # 存入到redis中
    json_house = json.dumps(house_dict)
    try:
        redis_store.setex("house_info_%s" % house_id,
                          constants.HOUSE_DETAIL_REDIS_EXPIRE_SECOND,
                          json_house)
    except Exception as e:
        logging.error(e)

    resp = '{"errno":"0", "errmsg":"OK", "data":{"user_id":%s, "house":%s}}' % (
        user_id, json_house)
    return resp
Exemplo n.º 3
0
def get_area_info():
    """
    1. 访问redis获取缓存
    2. 没有缓存, 查询MySQL
    3. 需要对数据转JSON
    4. 保存redis中
    5. 如果有缓存, 返回缓存数据
    6. 返回给浏览器
    """
    try:
        areas_json = redis_store.get('area_info')
    except Exception as e:
        logging.error(e)
        # 这里不需要返回错误信息, 因为没有会直接查询数据库
        # 为了避免异常的事情发生, 如果执行失败, 就把数据设置为None
        areas_json = None

    # 没有缓存, 查询数据库
    if areas_json is None:
        # 查询数据库中城区信息
        areas_list = Area.query.all()
        # print areas_list
        # 想给前端传递数据格式为
        # "data": {"areas":[{"aid": 1,"aname": "东城区"},{"aid": 2,"aname": "西城区"}]}
        areas_dict = {"areas": [area.to_dict() for area in areas_list]}
        # print areas_dict

        # json dict--->json str
        areas_json = json.dumps(areas_dict)
        # print areas_json
        # 将数据保存到数据库Redis中
        try:
            redis_store.setex('area_info', constants.AREA_INFO_REDIS_EXPIRES,
                              areas_json)
        except Exception as e:
            logging.error(e)
            # 这里只是对数据进行Redis缓存, 如果没有数据, 就会去mysql数据库中读取数据

    # 返回数据

    # return '{"errno":RET.OK, "errmsg": "查询城区信息成功", "data": %s}' % areas_json
    # RET.OK 直接使用返回不了数据
    # return jsonify({"errno":RET.OK, "errmsg": "查询城区信息成功", "data": areas_json})
    # 前面已经将区域数据转为JSON了. 这里不需要再次调用jsonify来返回, 直接返回字典格式的信息即可

    return '{"errno": %s, "errmsg": "查询城区信息成功", "data": %s}' % (RET.OK,
                                                                areas_json)
Exemplo n.º 4
0
def get_house_index():
    '''获取主页幻灯片展示的房屋基本信息'''
    # 从缓存中尝试获取数据
    try:
        ret = redis_store.get('home_page_data')
    except Exception as e:
        logging.error(e)
        ret = None
    if ret:
        logging.info('hit house info redis')
        return '{"errno":0, "errmsg":"OK", "data":%s}' % ret

    # 缓存中没有数据, 查询数据库, 将热门的5条数据展示出来
    try:
        # 查询数据库, 返回房屋订单数据最多的5条数据
        houses = House.query.order_by(House.order_count.desc()).limit(
            constants.HOME_PAGE_MAX_HOUSES)
    except Exception as e:
        logging.error(e)
        return jsonify(errno=RET.DBERR, errmsg='查询数据失败')

    if houses is None:
        return jsonify(errno=RET.NODATA, errmsg='查询无数据')

    # 以'data':{'data1':[{}, {}, {}...]}数据格式传递数据给前端
    houses_list = list()
    for house in houses:
        # 如果房屋未设置主图片, 则跳过
        if not house.index_image_url:
            continue
        houses_list.append(house.to_basic_dict())
    # 将数据转换为json, 并保存到Redis
    json_houses = json.dumps(houses_list)
    # print '-'*30
    # print json_houses
    # print '-'*30
    # print type(json_houses)

    try:
        redis_store.setex('home_page_data',
                          constants.HOME_PAGE_DATA_REDIS_EXPIRES, json_houses)
    except Exception as e:
        logging.error(e)

    return '{"errno":0, "errmsg":"OK", "data":%s}' % json_houses
Exemplo n.º 5
0
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, image_code_id]):
        return jsonify({'errno': RET.PARAMERR, 'errmsg': '参数不完整, 请重新填写'})

    # 逻辑处理
    # 和Redis数据对比
    # 获取Redis数据, 判断是否为空
    try:
        real_image_code = redis_store.get('image_code_%s' % image_code_id)
    except Exception as e:
        logging.error(e)
        return jsonify({'errno': RET.DBERR, 'errmsg': '数据库查询异常'})

    if real_image_code is None:
        return jsonify({'errno': RET.NODATA, 'errmsg': '验证码已失效或已删除'})

    # 无论图片验证码正确与否, 只能使用一次, 就需要删除
    try:
        redis_store.delete('image_code_%s' % image_code_id)
    except Exception as e:
        logging.error(e)

    # 和用户传入的图片验证码数据对比, 注意: 大小写, 这里统一转换成小写
    if image_code.lower() != real_image_code.lower():
        return jsonify({'errno': RET.DATAERR, 'errmsg': '验证码输入有误'})

    # 判断用户是否注册过, 判断是否为空
    try:
        user = User.query.filter_by(mobile=mobile).first()
    except Exception as e:
        logging.error(e)
    else:
        if user is not None:
            return jsonify({'errno': RET.DATAEXIST, 'errmsg': '此号码已被注册'})

    # 发送短信验证码
    # 自行生成验证码, 06d: 要求6位数, 不足以0补齐
    sms_code = '%06d' % random.randint(0, 999999)

    # 保存到Redis数据库中
    try:
        redis_store.setex('sms_code_%s' % mobile,
                          constants.SMS_CODE_REDIS_EXPIRE, sms_code)
    except Exception as e:
        logging.error(e)
        return jsonify({'errno': RET.DBERR, 'errmsg': '访问数据库发生异常'})

    # 调用云通讯接口, 发送验证码
    ccp = CCP()
    try:
        status_code = ccp.send_template_sms(
            mobile,
            [sms_code, str(constants.SMS_CODE_REDIS_EXPIRE / 60)], 1)
    except Exception as e:
        logging.error(e)
        return jsonify({'errno': RET.THIRDERR, 'errmsg': '发送短信验证码失败'})

    # 返回数据
    if status_code == '000000':
        return jsonify({'errno': RET.OK, 'errmsg': '发送短信验证码成功'})
    else:
        return jsonify({'errno': RET.THIRDERR, 'errmsg': '发送短信验证码失败'})