コード例 #1
0
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
コード例 #2
0
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
コード例 #3
0
ファイル: user.py プロジェクト: ziying123/FlaskFrame
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="发送失败")
コード例 #4
0
ファイル: user.py プロジェクト: ziying123/FlaskFrame
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())
コード例 #5
0
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