Exemple #1
0
 def get(self):
     args = reset_parser.parse_args()
     phone = args.get('phone')
     imageCode = args.get('imageCode').replace('\n', '').replace('\r', '')
     current_app.logger.info(imageCode)
     print(imageCode, '----', type(imageCode))
     code = session.get('imageCode')
     print(code, '----', type(code))
     if code and imageCode.lower() == code.lower():
         print(111)
         user = User.query.filter(User.phone == phone).first()
         if user:
             result, smscode = send_message(phone)
             current_app.logger.info(result)
             if result['statusCode'] == '000000':
                 # current_app.logger.info(result)
                 cache.set(phone, smscode, timeout=1000)
                 return jsonify(code=200, msg='发送成功')
             else:
                 current_app.logger.error(result)
                 return jsonify(code=400, msg='发送失败')
         else:
             return jsonify(code=400, msg='用户名不存在')
     else:
         return jsonify(code=400, msg='验证码有误')
Exemple #2
0
def my_before_request():
    '''用户权限验证'''
    # 查询网站底部信息,先从缓存中取,无则在数据库中查找,并更新缓存
    g.bottom_info = cache.get('bottom_info')
    if not g.bottom_info:
        try:
            bottom_info = BottomInfoModel.query.filter().first()
            g.bottom_info = bottom_info
            cache.set('bottom_info', bottom_info,
                      timeout=60 * 60 * 24)  # 更新缓存,1天
        except:
            g.bottom_info = None
    # 尝试获取用户id
    uid = session.get('uid')
    try:
        user = UserModel.query.get(uid)
        g.user = user  # 使用g对象存储用户,这样哪个页面都能用了
    except:
        # 查询数据库出错
        g.user = user = None

    # 未登录,不能访问
    if request.path in required_login_path and not user:
        return redirect(url_for('user.login'))

    # 已登录,不能访问
    if request.path in login_not_path and user:
        return redirect(url_for('main.index'))

    # 不是管理员不能访问
    if re.search(r'^/admin.*', request.path):
        if not user or user.is_admin != 1:  # 未登录或普通用户
            return abort(404)  # 抛出404错误,避免被发现后台管理路径
Exemple #3
0
    def post(self):
        args = lr_parser.parse_args()
        mobile = args.get('mobile')
        code = args.get('code')
        cache_code = cache.get(mobile)
        print('code:', code)
        print('cache_code:', cache_code)
        if cache_code and code == cache_code:
            # 数据库中查找是否存在此mobile
            user = User.query.filter(User.phone == mobile).first()
            # 列表中是否存在用户
            if not user:
                # 注册处理
                user = User()
                user.phone = mobile
                s = ''
                for i in range(13):
                    ran = random.randint(0, 9)
                    s += str(ran)

                user.username = '******' + s
                db.session.add(user)
                db.session.commit()
                #
            # 登录处理,记录登录状态:session,cookie,cache(redis)
            cache.set(mobile + "_", 1)
            return marshal(user, user_fields)  # 输出的内容
        else:
            return {'errmsg': '验证码错误', 'status': 400}
Exemple #4
0
def send_email_code():
    '''发送动态验证码'''
    form = SendEmailCodeForm()
    if request.method == 'POST' and form.validate_on_submit():
        # 接收邮箱号
        email = form.email.data
        # 判断缓存是否有值,有:表单重复提交
        if cache.get(email) == 1:
            # 重复提交表单处理
            return render_template('user/send_email_code.html',
                                   form=form,
                                   is_send_mail=1)

        # 生成随机动态验证码,保存到session
        email_code = str(random.randint(1000, 999999))  # 4~6位验证码,转为str发送邮件
        # 保存到session,邮箱也要保存到session
        session['email_code'] = email_code
        session['email'] = email

        # 发送动态验证码
        send_mail_code(email=email, email_code=email_code)
        is_send_mail = 1  # 标记动态验证码发送成功,用来返回给前端
        # 防止重复提交:设置一唯一个标志,放入缓存
        cache.set(email, 1, timeout=10)
        return render_template('user/send_email_code.html',
                               form=form,
                               is_send_mail=is_send_mail)
    return render_template('user/send_email_code.html', form=form)
Exemple #5
0
 def post(self):
     args = lr_parser.parse_args()
     mobile = args.get('mobile')
     code = args.get('code')
     cache_code = cache.get(mobile)
     if cache_code and code == cache_code:
         # if code == '1234':
         # 数据库中查找是否存在此mobile用户
         user = User.query.filter(User.phone == mobile).first()
         if not user:  # 无用户
             # 注册处理
             user = User()
             user.phone = mobile
             s = ''
             for i in range(10):
                 ran = random.randint(0, 9)
                 s += str(ran)
             user.username = '******' + s
             db.session.add(user)
             db.session.commit()
         # 登录处理 记录登录状态:session(一个用户一个session),cookie,cache(redis所有用户用一个大池子),token
         token = str(uuid.uuid4()).replace('-', '') + str(
             random.randint(100, 999))
         # print('token:', token)
         # 存储用户的登录信息
         cache.set(token, mobile)
         return marshal(user, user_fields)  # 用装饰器则上下需返回一样格式的内容
         # return {'status': 200, 'msg': '用户登录成功', 'token': token}
     else:
         return {'errmsg': '验证码错误', 'status': 400}
Exemple #6
0
    def post(self):
        args = lr_parser.parse_args()
        mobile = args.get('mobile')
        code = args.get('code')
        cache_code = cache.get(mobile)
        print('code:', code)
        print('cache_code:', cache_code)
        if cache_code and code == cache_code:
            # 数据库中查找是否存在此mobile
            user = User.query.filter(User.phone == mobile).first()
            # 列表中是否存在用户
            if not user:
                # 注册处理
                user = User()
                user.phone = mobile
                s = ''
                for i in range(13):
                    ran = random.randint(0, 9)
                    s += str(ran)

                user.username = '******' + s
                db.session.add(user)
                db.session.commit()
                #
            # 登录处理,记录登录状态:session,cookie,cache(redis),token,JWT
            # 说明用户是登录成功的 dfjkdj-hdfjhsd34-sdjf83748-3847fnmm
            token = str(uuid.uuid4()).replace('-', '') + str(
                random.randint(100, 999))
            print('token:', token)
            # 存储用户的登录信息
            cache.set(token, mobile)
            return {'status': 200, 'msg': '用户登录成功', 'token': token}
        else:
            return {'errmsg': '验证码错误', 'status': 400}
Exemple #7
0
    def post(self):
        args = lor_parser.parse_args()
        phone = args.get('phone')
        code = args.get('code')
        print(type(code), phone)
        cache_code = cache.get(phone)
        print(cache_code, type(cache_code))

        if cache_code and code == str(cache_code):
            user = User.query.filter(User.phone == phone).first()
            if not user:
                user = User()
                user.phone = phone
                now_time = datetime.now().strftime('%Y%m%d%H%M%S')
                user.username = '******' + now_time
                db.session.add(user)
                db.session.commit()

            token = str(uuid.uuid4())
            print(token, '--------')
            cache.set(token, phone)
            return jsonify(code=200, msg='登录成功', token=token)

        else:
            return jsonify(code=400, msg='验证码错误')
Exemple #8
0
 def post(self):
     args = password_login_parser.parse_args()
     phone = args.get('phone')
     password = args.get('password')
     user = User.query.filter(User.phone == phone).first()
     if check_password_hash(user.password, password):
         token = str(uuid.uuid4())
         cache.set(token, phone)
         return jsonify(code=200, msg='登录成功', token=token)
     else:
         return jsonify(code=400, msg='登录失败')
Exemple #9
0
    def post(self):
        args = sms_parser.parse_args()
        phone = args.get('phone')
        result, code = send_message(phone)
        current_app.logger.info(result)
        if result['statusCode'] == '000000':

            cache.set(phone, code, timeout=1000)
            return jsonify(code=200, msg='发送成功')
        else:
            current_app.logger.error(result)
            return jsonify(code=400, msg='发送失败')
Exemple #10
0
def send_msg():
    '''发送短信验证码'''
    phone = request.args.get('phone')
    print(phone, '************************************')
    ret, code = sms_send(phone)
    cache.set(phone, code, timeout=180)  # 验证码缓存到redis,(key,value, timeout)
    # cache.set_many([(key, value), (key, value), ...])  # 缓存多个
    # cache.get(key)  # 获取, cache.get_many(key, key2, ...)
    # cache.delete(key)  # 删除, cache.delete_many(key, key2, ...)
    # cache.clear()  # 清空

    return jsonify(code=200, msg='短信发送成功')
Exemple #11
0
def message_board():
    '''留言板'''
    form = MessageBoradForm()

    # get请求
    try:
        p = int(request.args.get('page', 1))  # 页码要为整形
    except:
        p = 1
    # 查询数据,分页,按id降序
    try:
        message_list = MessageBoardModel.query.order_by(
            -MessageBoardModel.id).paginate(page=p, per_page=20)
    except:
        return render_template('main/message_board.html', form=form)

    # post请求
    # 是否登录
    if request.method == 'POST' and not g.user:
        return render_template('main/message_board.html',
                               form=form,
                               message_list=message_list,
                               msg='请先登录')

    # 表单验证
    if request.method == 'POST' and form.validate_on_submit():
        # 接收数据
        content = form.content.data
        # 查看缓存判断是否重复提交
        if cache.get(str(g.user.id) + content + request.path) == 1:
            return redirect(url_for('main.message_board'))

        # 创建对象
        item = MessageBoardModel()
        item.content = content
        item.user_id = g.user.id
        # 提交数据库
        try:
            db.session.add(item)
            db.session.commit()
            # 缓存,10秒内不能重复提交,唯一标识key:用户id+内容+请求路径
            cache.set(str(g.user.id) + content + request.path, 1, timeout=10)
            return redirect(url_for('main.message_board'))
        except:
            return render_template('main/message_board.html',
                                   form=form,
                                   message_list=message_list,
                                   msg='提交失败')
    # get请求
    return render_template('main/message_board.html',
                           form=form,
                           message_list=message_list)
Exemple #12
0
    def post(self):
        args = password_login_parser.parse_args()
        mobile = args.get('mobile')
        password = args.get('password')
        # 判断用户
        user = User.query.filter(User.phone == mobile).first()
        if user:
            if check_password_hash(user.password, password):
                # 说明用户是登录成功的
                cache.set(mobile + '_', 1)
                return {'status': 200, 'msg': '用户登录成功'}

        return {'status': 400, 'msg': '账户名或者密码有误!'}
Exemple #13
0
 def post(self):
     args = sms_parser.parse_args()
     mobile = args.get('mobile')
     ret, code = send_duanxin(mobile)
     # 验证是否发送成功
     if ret is not None:
         if ret["code"] == 200:
             # cache.set(key,value,timeout=second)
             cache.set(mobile, code, timeout=1800)
             return jsonify(code=200, msg='短信发送成功!')
     else:
         print("ERROR: ret.code=%s,msg=%s" % (ret['code'], ret['msg']))
         return jsonify(code=400, msg='短信发送失败!')
def email_captcha():
    email = request.args.get('email')
    if not email:
        return 'empty address', 400
    captcha = ''.join(map(str, np.random.randint(0, 10, 6)))
    if cache.get(email):
        return 'request too frequently'
    msg = Message('百团通注册验证码', recipients=[email], body='您的验证码是:%s' % captcha)
    try:
        mail.send(msg)
    except smtplib.SMTPException:
        return 'sending failed', 500
    cache.set(email, captcha)
    return 'success', 200
Exemple #15
0
def sendmess(mobile):
    r = str(int(random.random() * 10000 // 1))
    text = "您的验证码是:%s。请不要把验证码泄露给其他人。" % r
    ret = smssend.send_sms(text, mobile)
    ret = eval(ret.decode('utf-8'))
    # print(ret)
    if ret is not None:
        if ret["code"] == 2:
            # 使用缓存 过期时间为180s
            cache.set(mobile, str(r), timeout=18000)
            return jsonify(code=2, msg='短信发送成功')
        else:
            # cache.set(mobile, str(r), timeout=18000)
            return jsonify(code=0, msg='短信未发送成功')
def del_cache_():
    """
    cache缓存值
    :return:
    """
    cache.set('name', 'xiaoming', timeout=30)
    cache.set('person', {'name': 'aaa', 'age': 20})
    x = cache.get('name')
    print(x)
    cache.set_many([('name1', 'hhh'), ('name2', 'jjj')])
    print(cache.get_many("name1", "name2"))
    print(cache.delete("name"))
    print(cache.delete_many("name1", "name2"))
    print(cache.get('person'))
    return 'ok'
Exemple #17
0
 def post(self):
     args = password_login_parser.parse_args()
     mobile = args.get('mobile')
     password = args.get('password')
     # 判断用户
     user = User.query.filter(User.phone == mobile).first()
     if user:
         if check_password_hash(user.password, password):
             # 说明用户登录成功
             token = str(uuid.uuid4()).replace('-', '') + str(
                 random.randint(100, 999))
             # print(token)
             # 存储用户的登录信息
             cache.set(token, mobile)
             return {'status': 200, 'msg': '用户登录成功', 'token': token}
     return {'status': 400, 'msg': '账户名或者密码有误!'}
Exemple #18
0
def get_pic():
    # 造图片
    im, s = validate_picture(4)
    print('=====>s:', s)
    # 将图片转成二进制的形式
    buffer = BytesIO()
    im.save(buffer, 'jpeg')
    buf_bytes = buffer.getvalue()
    # 构建response对象
    response = make_response(buf_bytes)
    response.headers['Content-Type'] = 'image/jpg'
    # 保存s
    # session['pic_code'] = s
    cache.set('code_abc', s, timeout=120)
    print('---------->', s)
    return response
Exemple #19
0
def send_message():
    mobile = request.args.get('phone')
    import random
    r = str(int(random.random() * 10000 // 1))
    text = "您的验证码是:%s。请不要把验证码泄露给其他人。" % r
    ret = send_sms(text, mobile)
    ret = eval(ret.decode('utf-8'))
    print(ret)
    if ret is not None:
        if ret["code"] == 2:
            # 使用缓存 过期时间为180s
            # cache.set(key,value,timeout=s)
            cache.set(mobile, str(r), timeout=180)
            # session[ mobile ] = str(r)
            return jsonify(code=2, msg='短信发送成功')
        else:
            return jsonify(code=0, msg='提交失败')
Exemple #20
0
def get_img():
    '''返回一个图形验证码'''
    # 调用生成图片验证码的函数
    code, yzm_img = yzm()

    # 验证码保存到redis
    cache.set('code', code, timeout=180)

    # 创建一个缓冲区
    buffer = io.BytesIO()

    # 将图片保存到缓冲区
    yzm_img.save(buffer, 'jpeg')

    # 获取缓冲区里的二进制图片
    b_img = buffer.getvalue()

    # 二进制图片交给响应,响应头要改为图片类型
    res = make_response(b_img)
    res.headers['Content-Type'] = 'image/jpg'
    return res
Exemple #21
0
def bp_user_login():
    data = request.get_json()
    if not data and data is None:
        return Tools.generate_cors_response({'code': 200, 'msg': '缺少必要参数'})
    if not data.get('username'):
        return Tools.generate_cors_response({'code': 200, 'msg': '请输入用户名'})
    if not data.get('phone'):
        return Tools.generate_cors_response({'code': 200, 'msg': '请输入手机号码'})
    if not data.get('password'):
        return Tools.generate_cors_response({'code': 200, 'msg': '请输入密码'})
    user = User.query.filter(User.phone == data.get('phone')).first()
    if user and user.username == data.get('username') and check_password_hash(
            user.password, data.get('password')):
        token = str(uuid.uuid4()).replace('-', '') + str(
            random.randint(100, 999))
        cache.set(token, data.get('phone'), timeout=6000)
        return Tools.generate_cors_response({
            'code': 200,
            'msg': '登录成功',
            'token': token
        })
    return Tools.generate_cors_response({'code': 200, 'msg': '登录失败'})
Exemple #22
0
def send_request():
    # 获取phone
    phone = request.args.get('phone')
    url = 'https://api.netease.im/sms/sendcode.action'  # 网易云信接口
    headers = {}
    headers['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8'
    AppSecret = 'ee8d51d1061e'
    Nonce = '74093849032804'
    CurTime = str(time.time())
    headers['AppKey'] = 'cc735ffe22684cc4dab2dc943540777c'
    headers['Nonce'] = Nonce
    headers['CurTime'] = CurTime
    s = AppSecret + Nonce + CurTime
    headers['CheckSum'] = hashlib.sha1(s.encode('utf-8')).hexdigest().lower()
    res = requests.post(url, data={'mobile': phone}, headers=headers)
    print(res.text, type(res.text))
    json_obj = json.loads(res.text)  # 字典
    cache.set(phone, json_obj.obj)
    # print(res.content)
    if json_obj.code == 200:
        return {'msg': 'success'}
    else:
        return {'msg': 'fail'}
Exemple #23
0
 def get(self):
     args = reset_parser.parse_args()
     mobile = args.get('mobile')
     imageCode = args.get('imageCode')
     code = session.get('code')
     if code and imageCode.lower() == code.lower():
         # 判断手机号码
         user = User.query.filter(User.phone == mobile).first()
         if user:
             # 发送手机验证码
             ret, smscode = send_duanxin(mobile)
             if ret is not None:
                 if ret["code"] == 200:
                     # cache.set(key,value,timeout=second)
                     cache.set(mobile, smscode, timeout=180)
                     return jsonify(status=200, msg='短信发送成功!')
             else:
                 print("ERROR: ret.code=%s,msg=%s" %
                       (ret['code'], ret['msg']))
                 return jsonify(status=400, msg='短信发送失败!')
         else:
             return {'status': 400, 'msg': '此用户未注册,请注册'}
     else:
         return {'status': 400, 'msg': '验证码输入有误或者超时'}
Exemple #24
0
def index():
    '''首页'''
    # 先从缓存中获取数据,没有则到数据库查找,并更新缓存
    index_brief_introduction = cache.get('index_brief_introduction')
    scenic_spots_list = cache.get('scenic_spots_list')
    image_list = cache.get('image_list')

    # 查询首页简介数据
    if not index_brief_introduction:
        try:
            index_brief_introduction = IndexBriefIntroductionModel.query.filter(
            ).first()
            cache.set('index_brief_introduction',
                      index_brief_introduction,
                      timeout=60 * 60)  # 1小时
        except:
            index_brief_introduction = None

    # 查询景点数据
    if not scenic_spots_list:
        try:
            scenic_spots_list = ScenicSpotsModel.query.order_by(
                -ScenicSpotsModel.num).limit(4).all()
            cache.set('scenic_spots_list', scenic_spots_list,
                      timeout=60)  # 60秒
        except:
            scenic_spots_list = None

    # 轮播图
    if not image_list:
        try:
            image_list = BannerModel.query.filter().all()
            cache.set('image_list', image_list, timeout=60 * 60 * 24 * 7)  # 7天
        except:
            image_list = None
    return render_template('main/index.html',
                           index_brief_introduction=index_brief_introduction,
                           scenic_spots_list=scenic_spots_list,
                           image_list=image_list)
Exemple #25
0
def add_scenic_spot():
    '''添加景点'''
    cache.delete('scenic_spots_list')  # 删除缓存
    form = AddScenicSpotForm()
    is_succeed = 0  # 标志:添加成功为1,否则为0

    # 有sid则为编辑景点
    sid = request.args.get('sid')
    if sid:
        # 编辑景点表单验证
        form = EditScenicSpotForm()
        # 查询id对应景点
        item = ScenicSpotsModel.query.get(sid)

        if item and request.method == 'POST' and form.validate_on_submit():
            # 接收数据
            name = form.name.data
            content = form.content.data
            opening_hours = form.opening_hours.data
            rates = form.rates.data
            image = form.image.data
            images = request.files.getlist('images')  # 图集

            # 判断是否重复提交
            if cache.get(name) == 1:
                return redirect(url_for('admin.admin_index'))

            # 判断是否上传有封面图
            if image:
                # 判断上传封面图片大小,限制大小:5M
                size = image.read(5 * 1024 * 1024 + 1)  # 限制最大读取字节大小,防止读取全部
                if len(size) > 5 * 1024 * 1024:
                    return render_template('admin/add_scenic_spot.html',
                                           form=form,
                                           image_msg='大小不能超过5M',
                                           is_succeed=is_succeed,
                                           item=item)
                # 将二进制图片保存到本地
                image_filename = str(uuid.uuid4()) + '.jpg'  # 文件名
                image_path = os.path.join(settings.SCENIC_SPOT_DIR,
                                          image_filename)
                with open(image_path, 'wb') as f:
                    f.write(size)

                item.image = '/images/scenic_spot/' + image_filename

            # 更新数据库
            item.name = name
            item.content = content
            item.opening_hours = opening_hours if opening_hours else '24小时开放'
            item.rates = rates if rates else '免费'  # 三元表达式
            item.create_time = datetime.datetime.now().strftime(
                '%Y-%m-%d')  # 更新时间
            db.session.commit()

            # 判断是否上传有图集
            if images[0].filename != '':
                # 图集处理
                for img in images:
                    # 图片后缀名验证
                    if '.' not in img.filename or img.filename != '' and img.filename.rsplit(
                            '.')[1] not in ('png', 'jpg', 'gif', 'jpeg'):
                        return render_template(
                            'admin/add_scenic_spot.html',
                            form=form,
                            images_msg='只支持png,jpg,gif,jpeg格式的图片',
                            is_succeed=is_succeed,
                            item=item)
                    # 图片限制大小:15M
                    size = img.read(15 * 1024 * 1024 + 10)  # 读取15M加10字节
                    if len(size) > 15 * 1024 * 1024:
                        return render_template('admin/add_scenic_spot.html',
                                               form=form,
                                               images_too_big='最大只支持15M的图片',
                                               is_succeed=is_succeed,
                                               item=item)
                    # 创建文件名,景点id_uuid.jpg
                    img_filename = str(item.id) + '_' + str(
                        uuid.uuid4()) + '.jpg'
                    # 创建文件路径
                    img_path = os.path.join(settings.SCENIC_SPOT_IMAGES_DIR,
                                            img_filename)
                    # 图片保存到本地,二进制写入
                    with open(img_path, 'wb') as f:
                        f.write(size)

                    # 保存图片到数据库
                    try:
                        img_item = ScenicSpotsImagesModel()
                        img_item.image = '/images/scenic_spot_images/' + img_filename
                        img_item.scenic_spots_id = item.id
                        db.session.add(img_item)
                        db.session.commit()
                    except:
                        return render_template('admin/add_scenic_spot.html',
                                               form=form,
                                               is_succeed=is_succeed,
                                               msg='添加失败!',
                                               item=item)
            # 防止重复提交,设置唯一标识,放入缓存
            cache.set(name, 1, timeout=10)
            return render_template('admin/add_scenic_spot.html',
                                   form=form,
                                   item=item,
                                   is_succeed=1)

        # get请求(编辑)
        return render_template('admin/add_scenic_spot.html',
                               form=form,
                               item=item)

    # post请求+表单验证
    if request.method == 'POST' and form.validate_on_submit():
        # 接收数据
        name = form.name.data
        content = form.content.data
        opening_hours = form.opening_hours.data
        rates = form.rates.data
        image = form.image.data
        images = request.files.getlist('images')  # 图集

        # 判断是否重复提交
        if cache.get(name) == 1:
            return redirect(url_for('admin.admin_index'))

        # 判断上传封面图片大小,限制大小:5M
        size = image.read(5 * 1024 * 1024 + 1)  # 限制最大读取字节大小,防止读取全部
        if len(size) > 5 * 1024 * 1024:
            return render_template('admin/add_scenic_spot.html',
                                   form=form,
                                   image_msg='大小不能超过5M',
                                   is_succeed=is_succeed)

        # 将二进制图片保存到本地
        image_filename = str(uuid.uuid4()) + '.jpg'  # 文件名
        image_path = os.path.join(settings.SCENIC_SPOT_DIR, image_filename)
        with open(image_path, 'wb') as f:
            f.write(size)

        # 查询数据库是否有相同的景点名称,有则更新
        try:
            item = ScenicSpotsModel.query.filter(
                ScenicSpotsModel.name == name).first()
            if item:
                item.name = name
                item.content = content
                item.opening_hours = opening_hours if opening_hours else '24小时开放'
                item.rates = rates if rates else '免费'  # 三元表达式
                item.image = '/images/scenic_spot/' + image_filename
                item.create_time = datetime.datetime.now().strftime(
                    '%Y-%m-%d')  # 更新时间
                db.session.commit()

                # 判断是否上传有图集
                if images[0].filename != '':
                    # 图集处理
                    for img in images:
                        # 图片后缀名验证
                        if '.' not in img.filename or img.filename != '' and img.filename.rsplit(
                                '.')[1] not in ('png', 'jpg', 'gif', 'jpeg'):
                            return render_template(
                                'admin/add_scenic_spot.html',
                                form=form,
                                images_msg='只支持png,jpg,gif,jpeg格式的图片',
                                is_succeed=is_succeed)
                        # 图片限制大小:15M
                        size = img.read(15 * 1024 * 1024 + 1)
                        if len(size) > 15 * 1024 * 1024:
                            return render_template(
                                'admin/add_scenic_spot.html',
                                form=form,
                                images_too_big='最大只支持15M的图片',
                                is_succeed=is_succeed)
                        # 创建文件名,景点id_uuid.jpg
                        img_filename = str(item.id) + '_' + str(
                            uuid.uuid4()) + '.jpg'
                        # 创建文件路径
                        img_path = os.path.join(
                            settings.SCENIC_SPOT_IMAGES_DIR, img_filename)
                        # 图片保存到本地,二进制写入
                        with open(img_path, 'wb') as f:
                            f.write(size)

                        # 保存图片到数据库
                        try:
                            img_item = ScenicSpotsImagesModel()
                            img_item.image = '/images/scenic_spot_images/' + img_filename
                            img_item.scenic_spots_id = item.id
                            db.session.add(img_item)
                            db.session.commit()
                        except:
                            return render_template(
                                'admin/add_scenic_spot.html',
                                form=form,
                                is_succeed=is_succeed,
                                msg='添加失败!')
                # 防止重复提交,设置唯一标识,放入缓存
                cache.set(name, 1, timeout=10)
                return render_template('admin/add_scenic_spot.html',
                                       form=form,
                                       is_succeed=1)
        except:
            return render_template('admin/add_scenic_spot.html',
                                   form=form,
                                   is_succeed=is_succeed,
                                   msg='添加失败!')

        # 保存到数据库
        item = ScenicSpotsModel()
        item.name = name
        item.content = content
        item.opening_hours = opening_hours if opening_hours else '24小时开放'
        item.rates = rates if rates else '免费'  # 三元表达式
        item.image = '/images/scenic_spot/' + image_filename
        try:
            db.session.add(item)
            db.session.commit()

            # 判断是否上传有图集
            if images[0].filename != '':
                # 图集处理
                for img in images:
                    # 图片后缀名验证
                    if '.' not in img.filename or img.filename != '' and img.filename.rsplit(
                            '.')[1] not in ('png', 'jpg', 'gif', 'jpeg'):
                        return render_template(
                            'admin/add_scenic_spot.html',
                            form=form,
                            images_msg='只支持png,jpg,gif,jpeg格式的图片',
                            is_succeed=is_succeed)
                    # 图片限制大小:15M
                    size = img.read(15 * 1024 * 1024 + 1)
                    if len(size) > 15 * 1024 * 1024:
                        return render_template('admin/add_scenic_spot.html',
                                               form=form,
                                               images_too_big='最大只支持15M的图片',
                                               is_succeed=is_succeed)
                    # 创建文件名,景点id_uuid.jpg
                    img_filename = str(item.id) + '_' + str(
                        uuid.uuid4()) + '.jpg'
                    # 创建文件路径
                    img_path = os.path.join(settings.SCENIC_SPOT_IMAGES_DIR,
                                            img_filename)
                    # 图片保存到本地,二进制写入
                    with open(img_path, 'wb') as f:
                        f.write(size)

                    # 保存图片到数据库
                    try:
                        img_item = ScenicSpotsImagesModel()
                        img_item.image = '/images/scenic_spot_images/' + img_filename
                        img_item.scenic_spots_id = item.id
                        db.session.add(img_item)
                        db.session.commit()
                    except:
                        return render_template('admin/add_scenic_spot.html',
                                               form=form,
                                               is_succeed=is_succeed,
                                               msg='添加失败!')
            # 防止重复提交,设置唯一标识,放入缓存
            cache.set(name, 1, timeout=10)
            return render_template('admin/add_scenic_spot.html',
                                   form=form,
                                   is_succeed=1)
        except:
            return render_template('admin/add_scenic_spot.html',
                                   form=form,
                                   is_succeed=is_succeed,
                                   msg='添加失败!')
    # get请求
    return render_template('admin/add_scenic_spot.html', form=form)
Exemple #26
0
def add_info():
    '''发布公告'''
    form = AddInfoForm()
    is_succeed = 0  # 标志:添加成功为1,否则为0
    # get请求如果带有info_id,则为编辑公告

    # 编辑公告
    info_id = request.args.get('info_id')
    if info_id:
        # 查询id对应公告
        try:
            item = InfoModel.query.get(info_id)
            if request.method == 'POST' and form.validate_on_submit() and item:
                title = form.title.data
                # 判断是否重复提交
                if cache.get(title) == 1:
                    return redirect(url_for('admin.admin_index'))

                item.title = title
                item.content = form.content.data
                item.create_time = datetime.datetime.now().strftime(
                    '%Y-%m-%d')  # 更新时间
                db.session.commit()
                # 防止重复提交,设置唯一标识,放入缓存
                cache.set(title, 1, timeout=10)
                return render_template('admin/add_info.html',
                                       form=form,
                                       is_succeed=1)
            return render_template('admin/add_info.html',
                                   form=form,
                                   is_succeed=is_succeed,
                                   item=item)
        except:
            # 查询出错则转为添加公告
            return render_template('admin/add_info.html',
                                   form=form,
                                   is_succeed=is_succeed)

    # 发布或更新公告
    if request.method == 'POST' and form.validate_on_submit():
        # 接收数据
        title = form.title.data
        content = form.content.data
        # 判断是否重复提交
        if cache.get(title) == 1:
            return redirect(url_for('admin.admin_index'))

        # 查询数据库是否有相同的公告名称,有则更新公告
        try:
            item = InfoModel.query.filter(InfoModel.title == title).first()
            if item:
                item.title = title
                item.content = content
                item.create_time = datetime.datetime.now().strftime(
                    '%Y-%m-%d')  # 更新时间
                db.session.commit()
                # 防止重复提交,设置唯一标识,放入缓存
                cache.set(title, 1, timeout=10)
                return render_template('admin/add_info.html',
                                       form=form,
                                       is_succeed=1)
        except:
            return render_template('admin/add_info.html',
                                   form=form,
                                   is_succeed=is_succeed,
                                   msg='发布失败!')

        # 发布公告
        item = InfoModel()
        item.title = title
        item.content = content
        try:
            db.session.add(item)
            db.session.commit()
            # 防止重复提交,设置唯一标识,放入缓存
            cache.set(title, 1, timeout=10)
            return render_template('admin/add_info.html',
                                   form=form,
                                   is_succeed=1)
        except:
            return render_template('admin/add_info',
                                   form=form,
                                   is_succeed=is_succeed,
                                   msg='发布失败!')

    # 普通get请求(添加公告)
    return render_template('admin/add_info.html',
                           form=form,
                           is_succeed=is_succeed)
Exemple #27
0
 def test_register2(self, client):
     cache.set('*****@*****.**', '123')
     print(cache.get('*****@*****.**'))
     rv = register(client, 'lzh', r'heihei', r'*****@*****.**', '123')
     assert rv.data == b'user established'
Exemple #28
0
 def test_register6(self, client):
     cache.set('*****@*****.**', '123')
     rv = register(client, 'tbw', r'jojo', r'*****@*****.**', '123')
     assert rv.data == b'user established'
Exemple #29
0
 def test_register7(self, client):
     cache.set('*****@*****.**', '123')
     rv = register(client, '王蓝绅', r'jojojo', r'*****@*****.**', '123')
     assert rv.data == b'user established'
Exemple #30
0
def register():
    '''用户注册'''
    # 实例化一个表单验证对象
    form = UserRegisterForm()

    # 1表示已发送邮件,注册成功后才返回给前端
    is_send_register_mail = 1

    if request.method == 'POST':
        # 表单验证
        if form.validate_on_submit():
            # 验证通过,接收数据,可使用以下两种方式
            email = request.form.get('email')  # POST:form,GET:args
            password = form.password.data
            code = form.code.data
            # 判断是否重复提交表单
            if cache.get(email) == 1:
                return render_template('user/register.html',
                                       form=form,
                                       flag=is_send_register_mail)

            # 如果用户已注册,且已激活,first()得到一个对象,不加得到查询集
            # 方法一,取下标
            # user = UserModel.query.filter(UserModel.email == email)
            # user = user[0]
            # 方法二,first()
            user = UserModel.query.filter(UserModel.email == email).first()

            # 如果用户存在
            if user:
                # 用户存在且已激活
                if user.is_activate == 1:
                    return render_template('user/register.html',
                                           form=form,
                                           msg='邮箱已被注册')
                elif user.is_delete == 1:
                    # 恶意账户被管理员逻辑删除
                    return render_template('user/register.html',
                                           form=form,
                                           msg='该用户不能注册')
                elif user.is_delete == 0:
                    # 用户存在但未激活,未销号,只更新用户密码,然后重新发送激活邮件
                    user.password = generate_password_hash(
                        password, salt_length=9)  # 密码加密
                    try:
                        db.session.commit()
                    except:
                        # 提交数据库出错
                        return render_template('user/register.html',
                                               form=form,
                                               msg='注册失败')

                    # 发邮件(异步)
                    send_mail(email)
                    # 防止重复提交,设置一唯一个标志,放入缓存
                    cache.set(email, 1, timeout=10)
                    return render_template('user/register.html',
                                           form=form,
                                           flag=is_send_register_mail)

            # 用户不存在,注册新用户
            user = UserModel()
            user.email = email
            user.password = generate_password_hash(password,
                                                   salt_length=9)  # 密码加密
            try:
                db.session.add(user)
                db.session.commit()
            except:
                return render_template('user/register.html',
                                       form=form,
                                       msg='注册失败')

            # 发邮件(异步)
            send_mail(email)
            # 防止重复提交,设置一个唯一标志,放入缓存
            cache.set(email, 1, timeout=10)
            return render_template('user/register.html',
                                   form=form,
                                   flag=is_send_register_mail)

        # 表单验证未通过
        return render_template('user/register.html', form=form)
    # get请求
    return render_template('user/register.html', form=form)