コード例 #1
0
ファイル: houses.py プロジェクト: seselinfeng/ihome
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"}'
コード例 #2
0
ファイル: houses.py プロジェクト: seselinfeng/ihome
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"}
コード例 #3
0
ファイル: verify_code.py プロジェクト: seselinfeng/ihome
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
コード例 #4
0
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='保存成功')
コード例 #5
0
ファイル: houses.py プロジェクト: seselinfeng/ihome
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
コード例 #6
0
ファイル: verify_code.py プロジェクト: seselinfeng/ihome
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="发送成功")