增加数据库造数的接口
This commit is contained in:
0
common/__init__.py
Normal file
0
common/__init__.py
Normal file
61
common/apiResponse.py
Normal file
61
common/apiResponse.py
Normal file
@@ -0,0 +1,61 @@
|
||||
# encoding: UTF-8
|
||||
|
||||
from flask import make_response
|
||||
import json
|
||||
from decimal import Decimal
|
||||
from const import RES_CODE
|
||||
|
||||
|
||||
class ApiResponse(object):
|
||||
def __init__(self):
|
||||
self.success = False
|
||||
self.code = ''
|
||||
self.message = ''
|
||||
self.data = {}
|
||||
|
||||
@staticmethod
|
||||
def build_success(code=20000, message='', data=None):
|
||||
if data is None:
|
||||
data = {}
|
||||
response = ApiResponse()
|
||||
response.success = True
|
||||
response.code = code
|
||||
response.message = message
|
||||
response.data = data
|
||||
return response.cors_response(make_response(json.dumps(response, default=obj_2_json)))
|
||||
|
||||
@staticmethod
|
||||
def build_failure(code, msg='', data=None):
|
||||
response = ApiResponse()
|
||||
if data is None:
|
||||
data = {}
|
||||
if not msg:
|
||||
response.message = RES_CODE[code]
|
||||
else:
|
||||
response.message = msg
|
||||
response.success = False
|
||||
response.code = code
|
||||
response.data = data
|
||||
return response.cors_response(make_response(json.dumps(response, default=obj_2_json)))
|
||||
|
||||
@staticmethod
|
||||
def cors_response(res):
|
||||
res.headers['Access-Control-Allow-Origin'] = '*'
|
||||
res.headers['Access-Control-Allow-Methods'] = 'GET,POST,OPTIONS'
|
||||
res.headers['Access-Control-Allow-Headers'] = 'x-requested-with,content-type'
|
||||
return res
|
||||
|
||||
|
||||
def obj_2_json(obj):
|
||||
if isinstance(obj, dict):
|
||||
return obj
|
||||
if hasattr(obj, 'strftime'):
|
||||
return obj.strftime('%Y-%m-%d %H:%M:%S')
|
||||
if isinstance(obj, Decimal):
|
||||
return float(obj)
|
||||
return {
|
||||
'success': obj.success,
|
||||
'code': obj.code,
|
||||
'message': obj.message,
|
||||
'data': obj.data
|
||||
}
|
||||
98
common/cronRequest.py
Normal file
98
common/cronRequest.py
Normal file
@@ -0,0 +1,98 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from const import STRESS_URI, QE_DOMAIN
|
||||
|
||||
from common.getRequest import Request
|
||||
|
||||
|
||||
class CronRequest(object):
|
||||
def __init__(self, token):
|
||||
self.stress_api = STRESS_URI
|
||||
self.headers = {'accesstoken': token, 'Accept': '*/*', 'content-type': 'application/json;charset=UTF-8'}
|
||||
self.qe_domain = QE_DOMAIN
|
||||
|
||||
def create(self, params):
|
||||
url = self.stress_api + '/back-end/stress/schedule/save'
|
||||
ret = Request.go('post', url, params, self.headers)
|
||||
if not ret:
|
||||
return
|
||||
return ret.get('id')
|
||||
|
||||
def pause(self, jid):
|
||||
url = self.stress_api + '/back-end/stress/schedule/pause'
|
||||
params = [jid]
|
||||
Request.go('post', url, params, self.headers)
|
||||
|
||||
def resume(self, jid):
|
||||
url = self.stress_api + '/back-end/stress/schedule/resume'
|
||||
params = [jid]
|
||||
Request.go('post', url, params, self.headers)
|
||||
|
||||
def remove(self, jid):
|
||||
url = self.stress_api + '/back-end/stress/schedule/delete'
|
||||
params = [jid]
|
||||
Request.go('post', url, params, self.headers)
|
||||
|
||||
def update(self, req_params):
|
||||
url = self.stress_api + '/back-end/stress/schedule/update'
|
||||
Request.go('post', url, req_params, self.headers)
|
||||
|
||||
def test(self,req_params):
|
||||
url = self.stress_api + '/aida/keyword/run'
|
||||
print(url)
|
||||
b = Request.go('post', url, req_params, self.headers)
|
||||
print(b)
|
||||
|
||||
def scrapy(self):
|
||||
url = self.stress_api + '/data/detail/scrapy'
|
||||
req_params = {"team": "USER", "fileName": "", "username": "", "password": ""}
|
||||
b = Request.go('post', url, req_params, self.headers)
|
||||
print(b)
|
||||
|
||||
def detail(self):
|
||||
url = self.stress_api + '/detail/list'
|
||||
req_params = {"team": "USER", "fileName": "", "username": "", "password": ""}
|
||||
b = Request.go('get', url, req_params, self.headers)
|
||||
print(b)
|
||||
|
||||
def run(self):
|
||||
url = "https://172.19.28.91:8088/aida//it/api/create_dialog_by_user"
|
||||
# url = self.stress_api + '/create_dialog_by_user'
|
||||
req_params = {"user_id":597021,"req_data":"新增用户","issue_id":41}
|
||||
b = Request.go('get', url, req_params, self.headers)
|
||||
print(b)
|
||||
|
||||
def run_sim(self,req_params):
|
||||
url = "http://172.19.28.91:5012/api/aida/keyword/run"
|
||||
# url = "http://10.250.201.236:5012/api/aida/keyword/run"
|
||||
# url = self.stress_api + '/create_dialog_by_user'
|
||||
b = Request.go('post', url, req_params, self.headers)
|
||||
print(b)
|
||||
|
||||
def run_xiao(self,req_params):
|
||||
url = "https://qe.bg.huohua.cn/back-end/it/api/list_incomplete_special_by_teams"
|
||||
# url = "https://qe.bg.huohua.cn/back-end/it/api/get_team_server"
|
||||
b = Request.go('post', url, req_params, self.headers)
|
||||
print(b)
|
||||
|
||||
if __name__ == '__main__':
|
||||
test = CronRequest(token="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhY2NvdW50X2lkIjoxNDI4MSwidXNlcl9pZCI6MTQyODEsInVzZXJfbmFtZSI6InFpYW94aW5qaXUiLCJzY29wZSI6WyJzZXJ2ZXIiXSwibmFtZSI6Iuiwr-aWsOS5hSIsImV4cCI6MTY5ODc2MzcwMCwiYXV0aG9yaXRpZXMiOlsiUk9MRV9VU0VSIl0sImp0aSI6IjZhMTg1ZWFlLTEyOGQtNDg5Yy05N2Q0LWRlOTM2NzA4ZGZmMSIsImVtYWlsIjoicWlhb3hpbmppdUBzcGFya2VkdS5jb20iLCJjbGllbnRfaWQiOiJlZmZlY3QifQ.L5WeZwyctUl-kto0rejY3PC3J1O5sksRZcA-0yQJQSg")
|
||||
|
||||
# a={'method_name': 'logic_public_add_user_recharge','request_parameter': '{ "phone": "", "courseId": "", "classHour": 100}', 'request_id': 1199}
|
||||
# a={'method_name': 'kw_tmo_creat_lesson_classroom','request_parameter': '{ "classesId": 1200092722, "classroom_number": 1}', 'request_id': 1199}
|
||||
# a={'method_name': 'logic_cc_create_new_leads', 'request_parameter': '{ "phone": "", "subject": ""}', 'request_id': 1199}
|
||||
# a={'method_name': 'kw_get_class_student','request_parameter': '{ "class_id": 500911139}', 'request_id': 1199}
|
||||
import json
|
||||
dict_request = {'teacher_id': 'default', 'course_id': 851732, 'start_date': 'default', 'union_flag': 0, 'schedule_info_list': 'default', 'systemUserId': 10697}
|
||||
|
||||
a={'method_name': 'htm_public_classes_create_class','request_parameter': '{"teacher_id": "0", "course_id": 172, "start_date": "default", "union_flag": 0, "weekList": ["default"], "timeList": ["default"], "systemUserId": 586669}', 'request_id': 1199}
|
||||
# a={'method_name': 'student_finish_classroom','request_parameter': '{"classroom_code": "CR2310500625595", "student_user_id": 1882444, "systemUserId": 10697}', 'request_id': 1199}
|
||||
# a={'method_name': 'kw_create_test_case_robot','request_parameter': '{"systemUserId": "14263", "msg": "我有一个用例,名称为:testcase001,用例步骤如下:\n步骤1:新增一个用户\n步骤2:再新增一个用户\n步骤3:为步骤2的用户购买逻辑思维套餐\n步骤4:新建一个班级\n步骤5:补差升级\n步骤6:将步骤2的用户加入步骤4班级\n步骤7:将步骤1的用户加入步骤4班级\n步骤8:验证补差升级\n请帮忙生成自动化测试用例,请根据以上步骤结合提供的函数和函数返回信息,如果有步骤没有匹配到函数则填写NOKEYWORDS代替,生成一个robotframework的自动化测试用例,每个步骤加上注释"}', 'request_id': 1199}
|
||||
# test.test(a)
|
||||
b = {'teacher_id': '0', 'course_id': 10101, 'start_date': 'default', 'union_flag': 0, 'weekList': ['default'], 'timeList': ['default'], 'systemUserId': 586669}
|
||||
print(json.dumps(b))
|
||||
# test.detail()
|
||||
# test.scrapy()
|
||||
# test.run()
|
||||
# test.run_sim(a){"project_plan_id":"2282","team":""}
|
||||
sss = {"project_id":2282,"project_plan_id":"2282","team":""}
|
||||
test.run_xiao(req_params=sss)
|
||||
36
common/feishuMessage.py
Normal file
36
common/feishuMessage.py
Normal file
@@ -0,0 +1,36 @@
|
||||
import requests
|
||||
import json
|
||||
|
||||
|
||||
class FeiShuMessage:
|
||||
|
||||
def __init__(self):
|
||||
self.headers = {'Content-Type': 'application/json; charset=utf-8'}
|
||||
self.webhook = "https://open.feishu.cn/open-apis/bot/v2/hook/180fa48e-1474-448e-a3d5-1a530f6ca689"
|
||||
|
||||
def send_message(self, msg, url=None):
|
||||
url = url if url else self.webhook
|
||||
res = requests.post(url, headers=self.headers, json=msg, verify=False)
|
||||
if res.status_code == 200:
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
def is_valid_key_url(self, f_url):
|
||||
test_msg_body = {"msg_type": "text", "content": {"text": ""}}
|
||||
res = requests.post(f_url, headers=self.headers, json=test_msg_body, verify=False)
|
||||
if res.status_code == 200:
|
||||
code = json.loads(res.text)['code']
|
||||
if code == 19024:
|
||||
return True, ''
|
||||
else:
|
||||
return False, '不是有效的飞书关键字链接,请检查!'
|
||||
else:
|
||||
return False, '网络异常请稍后重试'
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
test = FeiShuMessage()
|
||||
msg = req_body = {"msg_type": "text", "content": {"text": ""}}
|
||||
url = "https://open.feishu.cn/open-apis/bot/v2/hook/180fa48e-1474-448e-a3d5-1a530f6ca689"
|
||||
print(test.is_valid_key_url(url))
|
||||
41
common/getRequest.py
Normal file
41
common/getRequest.py
Normal file
@@ -0,0 +1,41 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import requests
|
||||
import json
|
||||
from requests.exceptions import ConnectionError
|
||||
|
||||
from logger import logger
|
||||
|
||||
|
||||
class Request(object):
|
||||
|
||||
@classmethod
|
||||
def go(cls, method, url, params, headers=None, noFormat=False):
|
||||
# logger.info(f'发送{method}请求到: {url}, 参数: {params}')
|
||||
try:
|
||||
if method == 'get':
|
||||
response = requests.get(url=url, params=params, headers=headers, timeout=200)
|
||||
elif method == 'post':
|
||||
response = requests.post(url=url, data=json.dumps(params), headers=headers, timeout=200)
|
||||
else:
|
||||
logger.error(f'暂不支持{method}方法')
|
||||
return
|
||||
except ConnectionRefusedError:
|
||||
logger.error(f'服务请求失败:{url}')
|
||||
return
|
||||
except ConnectionError:
|
||||
logger.error(f'服务无法链接: {url}')
|
||||
return
|
||||
if response.status_code != 200:
|
||||
logger.error(f'返回码不等于200,请检查服务!{response.status_code}, {response.text}')
|
||||
else:
|
||||
resp_json = response.json()
|
||||
# logger.info(f'返回内容:{resp_json}')
|
||||
# noFormat: 不需要对返回内容进行校验,直接返回整个response
|
||||
if noFormat:
|
||||
return resp_json
|
||||
# 对response做校验,返回体为qe平台的通用格式
|
||||
if resp_json.get('success') or resp_json.get('code') == 20000:
|
||||
return resp_json.get('data')
|
||||
else:
|
||||
logger.error(resp_json)
|
||||
return
|
||||
24
common/getUserInfo.py
Normal file
24
common/getUserInfo.py
Normal file
@@ -0,0 +1,24 @@
|
||||
from common.getRequest import Request
|
||||
|
||||
from const import STRESS_URI
|
||||
|
||||
|
||||
class UserInfo(object):
|
||||
|
||||
@staticmethod
|
||||
def get_user_info(access_token, url_prefix=None, info='userId'):
|
||||
stress_uri = STRESS_URI
|
||||
url = "/back-end/stress/user/info"
|
||||
result = Request.go(method="get",
|
||||
url=stress_uri + url if not url_prefix else url_prefix + url,
|
||||
params=None,
|
||||
headers={"accessToken": access_token})
|
||||
return None if not result else result.get(info)
|
||||
|
||||
@staticmethod
|
||||
def get_user_info_by_user_id(access_token, user_id, info):
|
||||
stress_uri = STRESS_URI
|
||||
url = "/back-end/stress/user/infoFromId"
|
||||
result = Request.go(method="get", url=stress_uri+url, params={'userId': user_id},
|
||||
headers={"accessToken": access_token})
|
||||
return None if not result else result.get(info)
|
||||
98
common/sqlSession.py
Normal file
98
common/sqlSession.py
Normal file
@@ -0,0 +1,98 @@
|
||||
# 创建连接相关
|
||||
from sqlalchemy import create_engine, text
|
||||
from sqlalchemy.orm import sessionmaker
|
||||
from urllib.parse import quote_plus as urlquote
|
||||
|
||||
from const import sparkatp_sql_uri
|
||||
|
||||
from logger import logger
|
||||
|
||||
_ENGINE_CACHE = {}
|
||||
|
||||
|
||||
"""
|
||||
sql操作:
|
||||
排序:order_by(ChartsName.column.desc()/asc())
|
||||
limit: .offset(n)过滤前面n条数据 .limit(n)
|
||||
count: .count()计数
|
||||
是否存在:is_exist = session.query(exists().where(Book.id > 10)).scalar()
|
||||
or: .filter(or_(Chart.column == x, Chart.column > y)).all()
|
||||
one: .one()只获取一条,如不存在或存在多条都会报错
|
||||
first: 通过主键获取记录 filter(**).first()
|
||||
"""
|
||||
|
||||
|
||||
class SqlSession:
|
||||
def __init__(self, sql_uri=sparkatp_sql_uri):
|
||||
self.sql_uri = sql_uri
|
||||
self._session = self.get_session()
|
||||
|
||||
@staticmethod
|
||||
def build_postgres_uri(host, port, user, password, database):
|
||||
return f"postgresql+psycopg2://{user}:{urlquote(str(password))}@{host}:{port}/{database}"
|
||||
|
||||
def get_session(self):
|
||||
engine = _ENGINE_CACHE.get(self.sql_uri)
|
||||
if engine is None:
|
||||
engine = create_engine(
|
||||
self.sql_uri,
|
||||
pool_size=5,
|
||||
max_overflow=10,
|
||||
pool_pre_ping=True,
|
||||
pool_recycle=1800,
|
||||
pool_timeout=30,
|
||||
connect_args={
|
||||
'connect_timeout': 20,
|
||||
'options': '-c timezone=Asia/Shanghai'
|
||||
}
|
||||
)
|
||||
_ENGINE_CACHE[self.sql_uri] = engine
|
||||
Session = sessionmaker(bind=engine)
|
||||
session = Session()
|
||||
return session
|
||||
|
||||
def query(self, obj):
|
||||
return self._session.query(obj)
|
||||
|
||||
def add(self, added):
|
||||
self._session.add(added)
|
||||
|
||||
def add_all(self, added_list):
|
||||
if isinstance(added_list, list):
|
||||
self._session.add_all(added_list)
|
||||
else:
|
||||
logger.warning('只能传递list')
|
||||
|
||||
def flush(self):
|
||||
self._session.flush()
|
||||
|
||||
def commit(self):
|
||||
self._session.commit()
|
||||
|
||||
def close(self):
|
||||
self._session.close()
|
||||
|
||||
def execute(self, sql):
|
||||
return self._session.execute(text(sql))
|
||||
|
||||
def done(self, close=True):
|
||||
"""
|
||||
执行完插入、删除、修改等操作后执行done,如报错回滚本次事务的sql操作
|
||||
:return:
|
||||
"""
|
||||
try:
|
||||
self.commit()
|
||||
if close:
|
||||
self.close()
|
||||
except Exception as e:
|
||||
logger.warning(e)
|
||||
self._session.rollback()
|
||||
return e
|
||||
|
||||
@property
|
||||
def session(self):
|
||||
return self._session
|
||||
|
||||
|
||||
def to_dict(self):
|
||||
return {c.name: getattr(self, c.name, None) for c in self.__table__.columns}
|
||||
Reference in New Issue
Block a user