功能模块编写完成

This commit is contained in:
pengtao 2019-07-05 18:09:56 +08:00
commit 0dc05d0649
11 changed files with 366 additions and 0 deletions

19
.idea/dataSources.xml generated Normal file
View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DataSourceManagerImpl" format="xml" multifile-model="true">
<data-source source="LOCAL" name="192.168.100.30" uuid="89d64204-61ba-45a4-b3e2-5a9147f6f785">
<driver-ref>mysql</driver-ref>
<synchronize>true</synchronize>
<jdbc-driver>com.mysql.jdbc.Driver</jdbc-driver>
<jdbc-url>jdbc:mysql://192.168.100.30:3306/test</jdbc-url>
<driver-properties>
<property name="autoReconnect" value="true" />
<property name="zeroDateTimeBehavior" value="convertToNull" />
<property name="tinyInt1isBit" value="false" />
<property name="characterEncoding" value="utf8" />
<property name="characterSetResults" value="utf8" />
<property name="yearIsDateType" value="false" />
</driver-properties>
</data-source>
</component>
</project>

6
.idea/vcs.xml generated Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

6
config.py Normal file
View File

@ -0,0 +1,6 @@
# -*- coding: utf-8 -*-
redis_company_config = {'host': '192.168.100.20', 'port': 6379, 'db': 1}
expirt_time = 7200
mysql_promotion_config = {'user': 'miles', 'pswd': 'aspect', 'host': '192.168.100.30', 'db': 'test'}
#mysql_promotion_config = {'user': 'mytga', 'pswd': 'gzVwh4HGR68G', 'host': '10.10.3.5', 'db': 'games_report'}
#redis_company_config = {'host': '10.10.3.10', 'port': 6379, 'db': 2}

1
handler/__init__.py Normal file
View File

@ -0,0 +1 @@
# -*- coding: utf-8 -*-

1
log/__init__.py Normal file
View File

@ -0,0 +1 @@
# -*- coding: utf-8 -*-

25
log/mylog.py Normal file
View File

@ -0,0 +1,25 @@
import logging
def define_logger(filename="/data/logs/aa.log", debug=True):
logger = logging.getLogger("")
if debug == True:
logger.setLevel(logging.INFO)
else:
logger.setLevel(logging.ERROR)
# 设置输出格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# 设置日志文件处理器
fh = logging.FileHandler(filename)
fh.setFormatter(formatter) # 为这个处理器添加格式
# 设置屏幕stdout输出处理器
formatter_stdout = logging.Formatter('%(name)s - %(levelname)s - %(message)s')
sh = logging.StreamHandler(stream=None)
sh.setFormatter(formatter_stdout)
# 把处理器加到logger上
logger.addHandler(fh)
# logger.addHandler(sh)

1
mysql/__init__.py Normal file
View File

@ -0,0 +1 @@
# -*- coding: utf-8 -*-

179
mysql/mmysql.py Normal file
View File

@ -0,0 +1,179 @@
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
date: 2016/07/11
role: mysql的增删改查类
usage: m = mysqlBase(host='xxx',db='xxx',user='xxx',pwd='xxx') 实例化
m.insert('core',{'host_name':'ccc','process_name':'ddd','ip_addr':'192.168.136.41','status':'4'})
m.update('table',{'field1':'value1','field2':'value2'},'id=1') 更新表名 字段名 条件
m.delete('core','status=5 and id=12')
m.change("update core set a='aaa' where id=1") 可以多条插入
m.query("select * from core")
"""
import warnings
try:
import MySQLdb
except:
import pymysql
pymysql.install_as_MySQLdb()
import MySQLdb
import logging
log = logging.getLogger(__name__)
###mysql操作类
class MysqlBase:
###连接数据库
def __init__(self, **args):
###获取参数
self.host = args.get('host', 'localhost')
self.user = args.get('user')
self.pswd = args.get('pswd')
self.db = args.get('db', 'mysql')
self.port = args.get('port', '3306')
self.charset = args.get('charset', 'utf8')
try:
self.conn = MySQLdb.connect(host=self.host, user=self.user, passwd=self.pswd, db=self.db,
port=int(self.port), charset=self.charset)
self.curs = self.conn.cursor()
self.curs.execute('SET NAMES utf8')
except:
log.error('%s mysql connect error' % self.host)
raise ValueError('mysql connect error %s' % self.host)
###释放资源
def __del__(self):
self.curs.close()
self.conn.close()
###插入
def insert(self, table, data):
_field = ','.join(['`%s`' % (k_insert) for k_insert in data.keys()])
_value = ','.join(["'%s'" % (str(v_insert).replace("'", "\'")) for v_insert in data.values()])
###拼接成sql语句
_sql = 'INSERT INTO `%s`(%s) VALUES(%s)' % (table, _field, _value)
###执行
self.curs.lastrowid = 0
try:
self.curs.execute(_sql)
###提交
self.conn.commit()
# log.info('%s insert ' % _sql)
except:
self.conn.rollback()
log.error('%s insert error' % _sql)
raise ValueError('112,insert error %s' % _sql)
return self.curs.lastrowid
###更新
def update(self, table, data, condition):
_field = ','.join(["`%s`='%s'" % (k_update, str(data[k_update]).replace("'", "\'")) for k_update in data])
_sql = 'UPDATE `%s` SET %s WHERE %s' % (table, _field, condition)
###执行
resNum = 0
try:
resNum = self.curs.execute(_sql)
###提交
self.conn.commit()
# log.info('%s update ' % _sql)
except:
self.conn.rollback()
log.error('%s update error' % _sql)
raise ValueError('update error %s' % _sql)
return resNum
###删除
def delete(self, table, condition):
_sql = 'DELETE FROM `%s` WHERE %s' % (table, condition)
###执行
resNum = 0
try:
resNum = self.curs.execute(_sql)
###提交
self.conn.commit()
# log.info('%s delete ' % _sql)
except:
self.conn.rollback()
log.error('%s delete error' % _sql)
raise ValueError('112,delete error %s' % _sql)
return resNum
###直接给修改语句执行
def change(self, sql, many=False):
###过滤unknow table的warning
warnings.filterwarnings('ignore')
resNum = 0
if many:
try:
###多条同时插入
resNum = self.curs.executemany(sql, many)
self.conn.commit()
# log.info('%s exec ' % sql)
except:
self.conn.rollback()
log.error('%s exec error' % sql)
raise ValueError('exec error %s' % sql)
else:
try:
resNum = self.curs.execute(sql)
###提交
self.conn.commit()
# log.info('%s exec ' % sql)
except:
self.conn.rollback()
log.error('%s exec error' % sql)
raise ValueError('112,exec error %s' % sql)
return resNum
###查询
def query(self, sql):
res = ''
try:
self.curs.execute(sql)
res = self.curs.fetchall()
# log.info('%s query ' % sql)
except:
log.error('%s query error' % sql)
# raise ValueError('query error %s'% sql)
return res
if __name__ == "__main__":
args = dict()
args['host'] = '172.16.17.164'
args['user'] = 'miles'
args['pswd'] = 'aspect'
args['db'] = 'test'
sql_sel = "select * from bigdata_host limit 5"
m = MysqlBase(**args)
data = m.query(sql=sql_sel)
m.insert('bigdata_host', {
'hostname': 'ccc', 'remark': 'ddd', 'up_addr_p': '192.168.136.41', 'states': '4',
'enter_time': '2017-03-13'
})
m.delete('bigdata_host', 'hostname="ccc"')

1
redis/__init__.py Normal file
View File

@ -0,0 +1 @@
# -*- coding: utf-8 -*-

13
redis/myredis.py Normal file
View File

@ -0,0 +1,13 @@
# -*- coding: utf-8 -*-
import redis
import logging
import redis
from config import redis_company_config, expirt_time
log = logging.getLogger(__name__)
pool = redis.ConnectionPool(host=redis_company_config['host'], port=redis_company_config['port'],
db=redis_company_config['db'], decode_responses=True)
company_redis = redis.Redis(connection_pool=pool)
expirt_time = expirt_time

114
server.py Normal file
View File

@ -0,0 +1,114 @@
# -*- coding: utf-8 -*-
# pip install flask-restful
from flask import Flask, jsonify
from flask_restful import reqparse, abort, Api, Resource
from log.mylog import define_logger
import logging
from redis.myredis import company_redis, expirt_time
from mysql.mmysql import MysqlBase
from config import mysql_promotion_config
define_logger("/data/logs/promotion.log")
log = logging.getLogger(__name__)
app = Flask(__name__)
api = Api(app)
mydb = MysqlBase(**mysql_promotion_config)
parser = reqparse.RequestParser()
parser.add_argument('task')
# # 操作put / get / delete单一资源Todo
# shows a single todo item and lets you delete a todo item
class Company(Resource):
def get(self, comp_id):
try:
data = company_redis.hmget(comp_id, ['id', 'name', 'contact', 'appid', 'appkey'])
if not data:
sql = f"select id,name,contact,appid,appkey from company where id={comp_id};"
data = mydb.query(sql)
company = {}
company['id'], company['name'], company['contact'], company['appid'], company['appkey'] = data
company_redis.hmset(company['id'], company)
company_redis.expire(company['id'], expirt_time)
except Exception:
log.error(f"get company id {comp_id} failed! ", exc_info=True)
return jsonify({'code': 0})
return jsonify({'code': 1, 'body': data})
def delete(self, comp_id):
try:
company_redis.expirt(comp_id, 0)
del_sql = f'delete from company where id={comp_id};'
mydb.query(del_sql)
except Exception:
log.error(f"remove {comp_id} failed!", exc_info=True)
return jsonify({'code': 0})
return jsonify({'code': 1})
def post(self, comp_id):
args = parser.parse_args()
try:
company = {}
company['id'] = comp_id
company['name'] = args['name']
company['contact'] = args['contact']
company['appid'] = args['appid']
company['appkey'] = args['appkey']
# insert to mysql
mydb.insert("company", company)
# insert to redsi
company_redis.hmset(company['id'], company)
company_redis.expirt(company['id'], expirt_time)
except Exception:
log.error("set values to company mysql/redis failed!", exc_info=True)
return jsonify({'code': 0})
return jsonify({'code': 1})
def put(self, comp_id):
args = parser.parse_args()
try:
company = {}
company['id'] = comp_id
company['name'] = args['name']
company['contact'] = args['contact']
company['appid'] = args['appid']
company['appkey'] = args['appkey']
# insert to mysql
update_sql = f"update company set id={company['id']} name={company['name']} contact={company['contact']}\
appid={company['appid']} appkey={company['appkey']} where id={comp_id};"
mydb.query("company", update_sql)
# update redsi
company_redis.hmset(company['id'], company)
company_redis.expirt(company['id'], expirt_time)
except Exception:
log.error("update values to company redis,mysql failed!", exc_info=True)
return jsonify({'code': 0})
return jsonify({'code': 1})
# # 操作post / get资源列表TodoList
# shows a list of all todos, and lets you POST to add new tasks
class CompanyList(Resource):
def get(self):
return jsonify({'code': 1, 'body': company_redis.lrang("ALL_Company", 0, -1)})
def post(self):
args = parser.parse_args()
try:
company_redis.rpush("ALL_Company", args['company'])
except Exception:
log.error("Insert values to redis failed,args was {}!".format(args), exc_info=True)
return jsonify({'code': 0})
return jsonify({'code': 1})
# 设置路由
api.add_resource(CompanyList, '/company')
api.add_resource(Company, '/company/<comp_id>')
if __name__ == '__main__':
app.run(debug=True, port=8888)