Exemplo n.º 1
0
def execute_interface_test(interface_test_id=None):
    if interface_test_id == None:
        return {'error': '无效的请求'}, 404

    db = get_db()
    logger = get_logger()
    user_id = session.get('user_id')
    user_obj = db.query(Userinfo).filter(Userinfo.id == user_id).first()
    logger.debug("执行内容:%s, 执行的用户id:%s, 执行的接口测试id:%s" %
                 ('interface_test', user_obj.id, interface_test_id))

    data = {
        'opt': 'execute_interface_test',
        'data': {
            'interface_test_id': interface_test_id,
            'user_id': session.get('user_id')
        }
    }

    ret = send_to_redis(data)
    if ret != 1:
        logger.warning('像redis添加数据失败.')
        return {'error': '执行失败! 请稍后重试.'}, 500

    # try:
    #     send_to_selenium(data)
    # except ConnectionResetError as error:
    #     # 让其重新连接,但不再发数据
    #     send_to_selenium({}, conn_flag=True)
    #     # 告诉前端这次请求失败
    #     logger.warning('连接selenium失败. %s' % error)
    #     return {'error': '执行失败! 请稍后重试.'}, 500

    return {}, 202
Exemplo n.º 2
0
    def delete(self):
        ret = {'flag': 0}

        # 获取用例id
        uc_id = request.form.get('use_case_id')
        db = get_db()
        # 删除用例逻辑,由于sqlalchemy没有级联删除,只能从没有建立外键的表删起来

        # 1. 先找出用例的步骤详情
        step_obj = db.query(Step_detail).filter(
            Step_detail.uc_id == uc_id).all()
        step_detail_id = [obj.id for obj in step_obj]
        # 2. 通过用例步骤的id去删除步骤执行结果的内容
        db.query(Result_step).filter(
            or_(Result_step.step_id.in_(step_detail_id),
                Result_step.parent_step_id.in_(step_detail_id))).delete(
                    synchronize_session=False)
        db.commit()
        # 3. 删除用例步骤和用例执行结果
        del_db_data(db,
                    db.query(Step_detail).filter(Step_detail.uc_id == uc_id))
        del_db_data(
            db,
            db.query(Use_case_result).filter(
                Use_case_result.use_case_id == uc_id))
        # 4. 删除用例
        result = del_db_data(db,
                             db.query(Use_case).filter(Use_case.id == uc_id))
        # 删除会返回,删除了几条符合的结果,如果结果为0表示就没找到这条用例
        if result == 0:
            ret['flag'] = 1
            ret['error_info'] = '删除失败'

        return jsonify(ret)
Exemplo n.º 3
0
    def post(self):
        interface_test_data = json.loads(request.data)
        request_params = interface_test_data.pop('request_params')
        header_params = interface_test_data.pop('header_params')
        interface_test_data['user_id'] = session.get('user_id')

        # 验证数据,待填

        # 保存数据
        db = get_db()
        try:
            inter_obj = Interface_test(**interface_test_data)
            db.add(inter_obj)
            db.flush()
            temp_obj = []
            for dic in request_params:
                dic['interface_test_id'] = inter_obj.id
                temp_obj.append(Params(**dic))
            for dic in header_params:
                dic['interface_test_id'] = inter_obj.id
                dic['params_type'] = 'header'
                temp_obj.append(Params(**dic))
            db.add_all(temp_obj)
            db.commit()
        except Exception as err:
            # 添加数据出错执行回滚操作
            logger.error('添加接口数据出错: %s' % err)
            db.rollback()
            return {'error': '添加出错!'}, 422

        return {}, 201
Exemplo n.º 4
0
def read_excel_data(file_path):
    db = get_db()
    workbook = xlrd.open_workbook(file_path)
    sheet = workbook.sheet_by_index(0)
    dic = {}
    params = []
    for index in range(sheet.nrows):
        row_data = sheet.row_values(index)
        if index == 1:
            project_obj = db.query(Project).filter(Project.project_name == row_data[1].strip()).first()
            dic['name'] = row_data[0]
            dic['project_id'] = project_obj.id if project_obj else ''
            dic['uc_type'] = row_data[2]
            dic['desc'] = row_data[3]
        elif index >= 3:
            temp = []
            for data in row_data[:-1]:
                if data.strip() != '':
                    temp.append(data)
            else:
                temp.append(str(int(row_data[-1])))
            params.append('@@'.join(temp))

    dic['params'] = '||'.join(params)
    dic['user_id'] = session.get('user_id')

    return dic
Exemplo n.º 5
0
    def delete(self):
        interface_test_id = request.form.get('interface_test_id', None)
        if interface_test_id is None:
            return {'error': '请求数据出错.'}, 422

        db = get_db()
        inter_obj = db.query(Interface_test).filter(
            Interface_test.id == interface_test_id).first()
        if not inter_obj:
            return {'error': '该数据不存在!'}, 410

        try:
            # (1) 删除接口测试结果
            db.query(Interface_test_result).filter(
                Interface_test_result.interface_test_id ==
                interface_test_id).delete()
            db.commit()
            # (2) 删除接口参数
            db.query(Params).filter(
                Params.interface_test_id == interface_test_id).delete()
            db.commit()
            # (3) 删除接口测试数据
            db.query(Interface_test).filter(
                Interface_test.id == interface_test_id).delete()
            db.commit()
        except Exception as error:
            db.rollback()
            logger.error('删除接口测试数据失败: %s' % error)
            return {'error': '删除失败!'}, 500

        return {}, 204
Exemplo n.º 6
0
    def delete(self):
        crontab_id = request.form.get('crontab_id')
        logger.debug('删除的任务id: %s' % crontab_id)

        db = get_db()
        obj = db.query(Crontab).filter(Crontab.id == crontab_id).first()

        # 发送crontab程序,删除任务
        try:
            send_to_crontab({'opt': 'del_task', 'data': {'crontab_id': crontab_id, 'task_id_name': obj.task_id_name}})
        except ConnectionAbortedError as error:
            logger.warning('连接crontab失败. %s' % error)
            # 重连
            send_to_crontab({}, conn_flag=True)
            return {'删除任务失败!'}, 500

        # 接收删除任务的结果
        sk = get_sk()
        del_result = recv_content(sk)
        logger.debug('添加任务的返回结果:%s' % del_result)
        if del_result.get('del_flag') != 0:
            return {'error': '删除任务失败!'}, 500

        # 删除表数据
        db.query(Crontab).filter(Crontab.id == crontab_id).delete()
        db.commit()

        return {}, 204
Exemplo n.º 7
0
    def get(self):
        db = get_db()
        # 获取用户
        user_id = session.get('user_id')
        username = session.get('login_user')
        # 获取用例对象
        uc_id = request.args.get('uc_id')
        uc_obj = db.query(Use_case).filter(Use_case.id == uc_id).first()
        # 获取用例结果对象
        uc_result_id = request.args.get('uc_result_id')
        uc_result_obj = db.query(Use_case_result).filter(Use_case_result.id == uc_result_id).first()
        # 查询步骤得执行结果
        result_step_objs = db.query(Result_step).filter(Result_step.uc_result_id == uc_result_id).all()
        # 格式化渲染得数据
        result_list = []
        step_success_count = 0
        step_failed_count = 0
        total_run_time = 0
        for obj in result_step_objs:
            # 查询对应步骤的参数和是否执行
            step_obj = db.query(Step_detail).filter(Step_detail.id == obj.step_id).first()
            error_info = obj.error_info if obj.error_info else ''
            result_list.append({'id': obj.id, 'params': step_obj.params, 'execute': step_obj.execute, 'status': obj.status, 'error_info': error_info, 'step_id': obj.step_id, 'parent_step_id': obj.parent_step_id, 'run_time': obj.run_time})
            # 记录步骤失败和成功的数量
            if obj.status == 1:
                step_success_count += 1
            else:
                step_failed_count += 1
            # 记录总运行时间
            if not obj.parent_step_id or obj.step_id == obj.parent_step_id:
                total_run_time += obj.run_time

        return render_template('step_result.html', uc_obj=uc_obj, result_list=result_list, username=username, uc_result_obj=uc_result_obj, step_success_count=step_success_count, step_failed_count=step_failed_count, total_run_time=total_run_time)
Exemplo n.º 8
0
def get_interface_test_data(interface_test_id):
    if interface_test_id is None:
        return {'error': 'not found.'}, 404

    db = get_db()
    inter_obj = db.query(Interface_test).filter(
        Interface_test.id == interface_test_id).first()
    dic = {
        'interface_name': inter_obj.interface_name,
        'interface_type': inter_obj.interface_type,
        'interface_description': inter_obj.interface_description,
        'request_type': inter_obj.request_type,
        'request_url': inter_obj.request_url,
        'request_params': [],
        'header_params': [],
    }
    params_objs = db.query(Params).filter(
        Params.interface_test_id == interface_test_id).all()
    for obj in params_objs:
        if obj.params_type == 'request':
            dic['request_params'].append({
                'key': obj.key,
                'value': obj.value,
                'description': obj.description,
                'execute': obj.execute
            })
        else:
            dic['header_params'].append({
                'key': obj.key,
                'value': obj.value,
                'description': obj.description,
                'execute': obj.execute
            })
    # print(dic)
    return dic
Exemplo n.º 9
0
def login():
    ret = {'flag': 0}
    data = request.form.to_dict()

    logger.debug('登陆数据: %s' % data)

    # 验证数据
    db = get_db()
    username = data.get('username')
    # 进行md5摘要
    password = get_md5(username, data.get('password'))
    # 查询数据
    obj = db.query(Userinfo).filter(Userinfo.username == username, Userinfo.password == password).first()
    if obj:
        # 设置session
        session['user_id'] = obj.id
        session['login_user'] = username
        # 设置cookie
        response = make_response(jsonify(ret))
        response.set_cookie('username', username)
        response.set_cookie('email', obj.email)
        return response

    else:
        ret['flag'] = 1
        ret['error_info'] = 'username or password error.'

    return jsonify(ret)
Exemplo n.º 10
0
def check_username_exists(username):
    flag = False
    db = get_db()
    obj = db.query(Userinfo).filter(Userinfo.username == username).first()
    if obj:
        flag = True
    return flag
Exemplo n.º 11
0
def get_screen_shot():
    uc_result_id = request.args.get('uc_result_id')
    db = get_db()
    result_step_obj = db.query(Result_step).filter(Result_step.uc_result_id == uc_result_id).all()
    img_file_lis = []
    for obj in result_step_obj:
        if obj.screen_shot != None:
            img_file_lis.append('/static/screen_shot/' + obj.screen_shot)
    return render_template('use_case_screen_shot.html', img_file_lis=img_file_lis)
Exemplo n.º 12
0
def check_public_uc_name(data):
    db = get_db()

    if data['uc_type'] == 'public':
        t = db.query(Use_case).filter(Use_case.uc_type == 'public', Use_case.name == data['name']).first()
        if t:
            return True

    return False
Exemplo n.º 13
0
def get_public_use_case():
    # 获取操作数据库的句柄
    db = get_db()
    # 获取所有的公共用例
    objs = db.query(Use_case).filter(Use_case.uc_type == 'public').all()
    # 进行格式化
    public_uc_data = []
    for obj in objs:
        public_uc_data.append({"id": obj.id, "use_case_name": obj.name})
    return jsonify(public_uc_data)
Exemplo n.º 14
0
    def get(self):
        opt = request.args.get('opt')
        search_content = request.args.get('search_content')

        db = get_db()
        username = session.get('login_user')
        user_obj = db.query(Userinfo).filter(
            Userinfo.username == username).first()

        # 查询数据,获取数据总数,放置分页器
        if not opt:
            interface_objs = db.query(Interface_test).filter(
                or_(Interface_test.user_id == user_obj.id,
                    Interface_test.interface_type == 'public'))
        else:
            search_content = '%' + search_content.strip() + '%'
            if opt == 'all':
                interface_objs = db.query(Interface_test).filter(
                    or_(Interface_test.user_id == user_obj.id,
                        Interface_test.interface_type == 'public'),
                    Interface_test.interface_name.like(search_content))
            elif opt == 'project':
                project_objs = db.query(Project).filter(
                    Project.project_name.like(search_content)).all()
                project_ids = []
                for obj in project_objs:
                    project_ids.append(obj.id)
                interface_objs = db.query(Interface_test).filter(
                    Interface_test.project_id.in_(project_ids))
            elif opt == 'public':
                interface_objs = db.query(Interface_test).filter(
                    Interface_test.interface_type == 'public',
                    Interface_test.interface_name.like(search_content))
            elif opt == 'general':
                interface_objs = db.query(Interface_test).filter(
                    Interface_test.user_id == user_obj.id,
                    Interface_test.interface_type == 'general',
                    Interface_test.interface_name.like(search_content))
        # 倒序
        interface_objs = interface_objs.order_by(Interface_test.id.desc())

        data_sum = interface_objs.count()
        page = Paging(request,
                      request.args.get('page', 1),
                      data_sum,
                      show_num=3)

        # 取数据
        interface_objs = interface_objs[page.start:page.end]

        return render_template('interface_test.html',
                               interface_objs=interface_objs,
                               page=page,
                               now_user_id=user_obj.id)
Exemplo n.º 15
0
def get_my_use_case():
    user_id = session.get('user_id')
    project_id = request.args.get('project_id')
    db = get_db()
    objs = db.query(Use_case).filter(Use_case.user_id == user_id,
                                     Use_case.project_id == project_id).all()
    response_data = []
    for obj in objs:
        response_data.append({'id': obj.id, 'data': obj.name})
    logger.debug('自己所有的用例数据: %s' % response_data)

    return jsonify(response_data)
Exemplo n.º 16
0
def get_project_data():
    db = get_db()
    project_objs = db.query(Project).all()
    data = []
    for obj in project_objs:
        data.append({
            'id': obj.id,
            'project_name': obj.project_name,
            'project_description': obj.project_description
        })

    return jsonify(data)
Exemplo n.º 17
0
    def delete(self, interface_test_id):
        result_id = interface_test_id
        db = get_db()
        try:
            db.query(Interface_test_result).filter(
                Interface_test_result.id == result_id).delete()
            db.commit()
        except Exception as error:
            db.rollback()
            logger.error('删除接口测试结果失败:%s' % error)
            return {'error': '删除失败!'}, 500

        return {}, 204
Exemplo n.º 18
0
def reset_pwd():
    ret = {'flag': 0}
    # 验证验证码
    if session['code'] != request.form.get('code').strip():
        ret['flag'] = 1
        ret['error_info'] = '验证码有误!'
    else:
        new_pwd = get_md5(session.get('temp_username'), request.form.get('new_pwd'))
        # 修改密码
        db = get_db()
        db.query(Userinfo).filter(Userinfo.id == session.get('temp_user_id')).update({'password': new_pwd})
        db.commit()

    return jsonify(ret)
Exemplo n.º 19
0
def get_use_case_step():
    # 获取操作数据库的句柄
    db = get_db()
    # 获取所有的步骤
    objs = db.query(Use_case_step).order_by(Use_case_step.id.asc()).all()
    # 进行格式化
    step_data = {}
    for obj in objs:
        step_data[obj.step_method_name] = {
            'step_name': obj.step_name,
            'step_length': obj.step_length
        }
    logger.debug('获取步骤选项数据: %s' % step_data)
    return jsonify(step_data)
Exemplo n.º 20
0
    def get(self):
        db = get_db()
        user_id = session.get('user_id')
        use_case_id = request.args.get('use_case_id')
        # 查用例数据
        uc_obj = db.query(Use_case).filter(Use_case.id == use_case_id).first()
        # 生成sql命令,查询该用户该用例的执行结果
        result_objs = db.query(Use_case_result).filter(Use_case_result.use_case_id == use_case_id, Use_case_result.user_id == user_id)
        # 获取数据量
        data_sum = result_objs.count()
        page = Paging(request, request.args.get('page', 1), data_sum, show_num=10)
        # 获取数据
        result_objs = result_objs[page.start: page.end]

        return render_template('use_case_result.html', result_objs=result_objs, uc_obj=uc_obj, page=page)
Exemplo n.º 21
0
def get_crontab_data(crontab_id):
    if crontab_id is None:
        return {'error': 'not found.'}, 404

    dic = {}
    db = get_db()
    obj = db.query(Crontab).filter(Crontab.id == crontab_id).first()
    dic['task_name'] = obj.task_name
    dic['project_id'] = obj.project_id
    dic['test_type'] = obj.test_type
    dic['test_data_id'] = obj.test_data_id
    dic['task_type'] = obj.task_type
    dic['execute_time'] = obj.execute_time
    dic['task_description'] = obj.task_description

    return dic
Exemplo n.º 22
0
    def put(self):
        ret = {'flag': 0}
        form = UseCaseForm()
        # 判断提交的内容
        if not form.validate_on_submit():
            # 没通过返回错误提示信息
            ret = form.errors
            ret['flag'] = 1
            return jsonify(ret)

        # form认证通过

        # 查找用户id
        db = get_db()
        # 格式化出保存的数据
        data = request.form.to_dict()
        data.pop('csrf_token')
        edit_id = data.pop('edit_use_case_id')
        # print(data, edit_id)

        # 如果是公共用例的检测重名
        if data['uc_type'] == 'public':
            if check_public_uc_name(data):
                ret['flag'] = 2
                ret['error_info'] = "编辑的用例与公共用例重名"
                return jsonify(ret)

        # 更新数据
        # 1.修改步骤数据(修改步骤表用例的id,由于有关联所以不能删)
        # 修改uc_id
        db.query(Step_detail).filter(Step_detail.uc_id == edit_id).update(
            {'delete_status': 1})
        step_data = []
        # 添加新的步骤数据,进行关联
        for step in data.pop('params').split('||'):
            temp = step.split('@@')
            execute = int(temp[-1])
            step_data.append(
                Step_detail(uc_id=edit_id, params=step, execute=execute))
        save_data_to_db(db, step_data)

        # 2.修改用例数据
        db.query(Use_case).filter(Use_case.id == edit_id).update(data)
        # 数据保存至硬盘
        db.commit()

        return jsonify(ret)
Exemplo n.º 23
0
def get_use_case_step_data():
    db = get_db()
    uc_id = request.args.get('use_case_id')
    use_case_obj = db.query(Use_case).filter(Use_case.id == uc_id).first()
    step_objs = db.query(Step_detail).filter(
        Step_detail.uc_id == uc_id, Step_detail.delete_status == 0).all()
    data = {
        'name': use_case_obj.name,
        'project_id': use_case_obj.project_id,
        'uc_type': use_case_obj.uc_type,
        'desc': use_case_obj.desc,
        'step': []
    }
    for obj in step_objs:
        data['step'].append(obj.params)

    return jsonify(data)
Exemplo n.º 24
0
def add_uc_data(data):
    db = get_db()
    params = data.pop('params')

    # 实例用例对象
    use_case_obj = Use_case(**data)
    use_case_obj.uc2step_detail = []

    # 实例用例步骤数据
    if params != '':
        many_param = params.split('||')
        for param in many_param:
            temp = param.split('@@')
            execute = int(temp[-1])
            use_case_obj.uc2step_detail.append(Step_detail(params=param, execute=execute))

    # 保存用例数据至数据库
    save_data_to_db(db, [use_case_obj])
Exemplo n.º 25
0
    def delete(self):
        ret = {'flag': 0}

        db = get_db()
        user_id = session.get('user_id')
        use_result_id = request.form.get('use_result_id')

        # 删除执行结果
        # 1.删除result_step表的内容
        del_db_data(db, db.query(Result_step).filter(Result_step.uc_result_id == use_result_id))
        # 2.删除use_case_result表的内容
        result = del_db_data(db, db.query(Use_case_result).filter(Use_case_result.id == use_result_id))

        # 删除会返回,删除了几条符合的结果,如果结果为0表示就没找到这条用例
        if result == 0:
            ret['flag'] = 1
            ret['error_info'] = '删除失败'

        return jsonify(ret)
Exemplo n.º 26
0
    def check_request_data(self, crontab_data):
        db = get_db()
        # 验证名称,是否不为空
        if crontab_data['task_name'].strip() == '':
            return False, {'error': '定时任务名称不能为空'}, 422

        # 验证名称是否重名
        if db.query(Crontab).filter(Crontab.task_name == crontab_data['task_name']).first():
            return False, {'error': '定时任务重名!'}, 422

        # 验证是否有这些测试数据
        if crontab_data['test_type'] == 'interface_test':
            if not db.query(Interface_test).filter(Interface_test.id == crontab_data['test_data_id'], Interface_test.user_id == crontab_data['user_id']).first():
                return False, {'error': '请求数据有误!'}, 422
        elif crontab_data['test_type'] == 'use_case_test':
            if not db.query(Use_case).filter(Use_case.id == crontab_data['test_data_id'], Use_case.user_id == crontab_data['user_id']).first():
                return False, {'error': '请求数据有误!'}, 422

        return True, {}, 200
Exemplo n.º 27
0
    def post(self):
        db = get_db()
        status_code = 201
        ret = {}

        data = request.form.to_dict()
        # 验证项目名称
        flag, error = self.check_project_name(db, data)
        if not flag:
            return {'error': error}, 422
        # 验证项目描述
        flag, error = self.check_project_description(data)
        if not flag:
            return {'error': error}, 422
        # 添加项目数据
        data['user_id'] = session.get('user_id')
        save_data_to_db(db, [Project(**data)])

        return ret, status_code
Exemplo n.º 28
0
    def get(self):
        opt = request.args.get('opt')
        search_content = request.args.get('search_content')

        db = get_db()
        user_id = session.get('user_id')
        # user_obj = db.query(Userinfo).filter(Userinfo.id == user_id).first()

        # 查询数据,获取数据总数,放置分页器
        if not opt:
            crontab_objs = db.query(Crontab).filter(Crontab.user_id == user_id)
        else:
            search_content = '%' + search_content.strip() + '%'
            if opt == 'all':
                crontab_objs = db.query(Crontab).filter(Crontab.user_id == user_id)
            elif opt == 'project':
                project_obj = db.query(Project).filter(Project.project_name.like(search_content)).first()
                crontab_objs = db.query(Crontab).filter(Crontab.user_id == user_id, Crontab.project_id == project_obj.id)
            elif opt == 'task_name':
                crontab_objs = db.query(Crontab).filter(Crontab.user_id == user_id, Crontab.task_name.like(search_content))

        # 倒序
        crontab_objs = crontab_objs.order_by(Crontab.id.desc())

        data_sum = crontab_objs.count()
        page = Paging(request, request.args.get('page', 1), data_sum, show_num=5)

        # 取数据
        crontab_objs = crontab_objs[page.start: page.end]

        # 初始化一下数据
        for obj in crontab_objs:
            if obj.test_type == 'interface_test':
                inter_obj = db.query(Interface_test).filter(Interface_test.id == obj.test_data_id).first()
                if inter_obj:
                    obj.test_data = inter_obj.interface_name
            elif obj.test_type == 'use_case':
                usecase_obj = db.query(Use_case).filter(Use_case.id == obj.test_data_id).first()
                if usecase_obj:
                    obj.test_data = usecase_obj.name

        return render_template('crontab.html', crontab_objs=crontab_objs, page=page, now_user_id=user_id)
Exemplo n.º 29
0
    def put(self):
        interface_test_data = json.loads(request.data)

        logger.debug('接口测试的更新数据提交内容: %s' % interface_test_data)

        edit_interface_test_id = interface_test_data.pop(
            'edit_interface_test_id')
        request_params = interface_test_data.pop('request_params')
        header_params = interface_test_data.pop('header_params')
        interface_test_data['user_id'] = session.get('user_id')

        # 验证数据

        # 更新数据
        db = get_db()
        try:
            # (1) 更新接口测试数据
            db.query(Interface_test).filter(
                Interface_test.id == edit_interface_test_id).update(
                    interface_test_data)
            # (2) 删除旧的接口参数数据
            db.query(Params).filter(
                Params.interface_test_id == edit_interface_test_id).delete()
            # (3) 添加新的接口参数数据
            temp_obj = []
            for dic in request_params:
                dic['interface_test_id'] = edit_interface_test_id
                temp_obj.append(Params(**dic))
            for dic in header_params:
                dic['interface_test_id'] = edit_interface_test_id
                dic['params_type'] = 'header'
                temp_obj.append(Params(**dic))
            db.add_all(temp_obj)
            # (4) 提交
            db.commit()
        except Exception as error:
            logger.error('更新接口数据出错: %s' % error)
            db.rollback()
            return {'error': '编辑有误!'}, 500

        return {}, 201
Exemplo n.º 30
0
def alter_email():
    ret = {'flag': 0}
    user_id = session.get('user_id')
    email = request.form.get('email')
    send_mail = int(request.form.get('send_mail'))
    # 修改邮箱
    db = get_db()
    if email != '':
        db.query(Userinfo).filter(Userinfo.id == user_id).update({'email': email, 'send_mail': send_mail})

        # 修改cookie
        response = make_response(jsonify(ret))
        response.set_cookie('email', email)

        return response

    else:
        db.query(Userinfo).filter(Userinfo.id == user_id).update({'send_mail': send_mail})
    db.commit()

    return jsonify(ret)