from rest_framework.views import APIView
import configparser
def read_cfg(name):
cfg = configparser.RawConfigParser()
cfg.read(settings.CONFIG_PATH, encoding='utf-8')
return cfg.items(name)
class get_dbs(APIView):
def get(self, request,*args,**kwargs):
dbs = read_cfg('db')
dbs_list =[]
d ={}
for k,v in dbs:
d['label']= k
d['value']= v
dbs_list.append(d)
d ={}
return JsonResponse({'code':1,'data': dbs_list})
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
然后配置前端,一打开页面就获取数据库信息
export default {
created(){
this.get_dbs()},}
async get_dbs(){//this.$http.get('dbs'),dbs为获取数据库信息的接口地址
const { data: res }= await this.$http.get('dbs')
if (res.code!==1){
return this.$message.error('获取dbs失败')}
this.operateFormLabel[0].children= res.data},
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
2. 让django处理前端传来的数据库信息
公司数据库为oracle,并且经过堡垒机,所以用到cx_Oracle和sshtunnel模块
from cx_Oracle import Connection
from sshtunnel import SSHTunnelForwarder
from rest_framework.views import APIView
class get_messages(APIView):
def post(self, request,*args,**kwargs):
data = json.loads(request.body.decode('utf-8'))
db = data['db']
#根据下拉框中选择的数据库名字,配置要连接的数据库
if not db:
return JsonResponse({'code':0,'msg':"请选择数据库"})
if db =='lt1':
conn =('192.168.2.1','ms','sgate;Normal;sms')
elif db =='lt2':
conn =('192.168.2.6','ms2','sgate;Normal;sms2')
#sshtunnel建立客户端与堡垒机的隧道
with SSHTunnelForwarder(('堡垒机地址', port),
ssh_username="ssw",
ssh_password="1223456",
remote_bind_address=(conn,1521))as server:
conn =(conn[1],'123456','127.0.0.1:%d/%s'%(server.local_bind_port,conn[2]))
xconn = Connection(*conn)
cursor = xconn.cursor() # 新建游标
cursor.execute(sql) # 执行sql语句
ret = cursor.fetchall()
cursor.close()
xconn.close()
old_views.py-read_cfg函数,get_sql函数读取config.cfg中的sql语句,比如读到名为“inspect”的语句,返回的结果是这样的 ['select project,ip,cpu,mem,disk,vda1,vdb1,network,service,url,create_time\nfrom weekly_check\nwhere create_time BETWEEN {1} AND {2}']
import configparser
def read_cfg(name):
cfg = configparser.RawConfigParser()
cfg.read(settings.CONFIG_PATH, encoding='utf-8')
return cfg.items(name)
#读取config.cfg中的sql语句,比如读到名为“inspect”的语句,返回的结果是这样的
#['select project,ip,cpu,mem,disk,vda1,vdb1,network,service,url,create_time\nfrom weekly_check\nwhere create_time BETWEEN {1} AND {2}']
def get_sql(sqlname):
data = read_cfg('sql')
sql =[item[1] for item in data if sqlname == item[0]]
return sql[0]
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
2. 对页面提交过来的sql语句进行处理
然后,对页面提交过来的sql语句进行处理:如修改日期,修改where条件,加上搜索条件等
old_views.py-get_messages()
if sqlname in('inspect'):
inputLabel =[]
field =[]
condition =[]
field_dict ={'network': network,'service': service}
for key, value in field_dict.items():
print('len(value)',len(value))
field.append(key)
condition.append("{0} like '%{1}%' and".format(key, value))
if sqlname =='inspect':
print('get_sql(sqlname)',get_sql(sqlname).format(','.join(field), start, end))
print('condition',condition)
sql = get_sql(sqlname).format(','.join(field), start, end).replace('where','where {0}').format(' '.join(condition))
import datetime
ret =(('农林牧渔','172.16.1.6','2.05','24.59','/dev/vda1 used: 7.9G nouse: 30G','19.75','74.11','异常','Bootlog: OK','',datetime.datetime(2022,8,19,16,17,12)),)
obj ={}
field =['network','service']
for item in ret:
for i, v in enumerate(field):
obj[v]= item[i]
print(obj)
输出为:
{'network':'农林牧渔','service':'172.16.1.6'}