From 0dc05d064981ebae7bfe7286e3c6bf7711b05bbc Mon Sep 17 00:00:00 2001 From: pengtao Date: Fri, 5 Jul 2019 18:09:56 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=9F=E8=83=BD=E6=A8=A1=E5=9D=97=E7=BC=96?= =?UTF-8?q?=E5=86=99=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/dataSources.xml | 19 +++++ .idea/vcs.xml | 6 ++ config.py | 6 ++ handler/__init__.py | 1 + log/__init__.py | 1 + log/mylog.py | 25 ++++++ mysql/__init__.py | 1 + mysql/mmysql.py | 179 ++++++++++++++++++++++++++++++++++++++++++ redis/__init__.py | 1 + redis/myredis.py | 13 +++ server.py | 114 +++++++++++++++++++++++++++ 11 files changed, 366 insertions(+) create mode 100644 .idea/dataSources.xml create mode 100644 .idea/vcs.xml create mode 100644 config.py create mode 100644 handler/__init__.py create mode 100644 log/__init__.py create mode 100644 log/mylog.py create mode 100644 mysql/__init__.py create mode 100644 mysql/mmysql.py create mode 100644 redis/__init__.py create mode 100644 redis/myredis.py create mode 100644 server.py diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml new file mode 100644 index 0000000..1b70a26 --- /dev/null +++ b/.idea/dataSources.xml @@ -0,0 +1,19 @@ + + + + + mysql + true + com.mysql.jdbc.Driver + jdbc:mysql://192.168.100.30:3306/test + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/config.py b/config.py new file mode 100644 index 0000000..542149b --- /dev/null +++ b/config.py @@ -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} \ No newline at end of file diff --git a/handler/__init__.py b/handler/__init__.py new file mode 100644 index 0000000..7c68785 --- /dev/null +++ b/handler/__init__.py @@ -0,0 +1 @@ +# -*- coding: utf-8 -*- \ No newline at end of file diff --git a/log/__init__.py b/log/__init__.py new file mode 100644 index 0000000..7c68785 --- /dev/null +++ b/log/__init__.py @@ -0,0 +1 @@ +# -*- coding: utf-8 -*- \ No newline at end of file diff --git a/log/mylog.py b/log/mylog.py new file mode 100644 index 0000000..ea6882d --- /dev/null +++ b/log/mylog.py @@ -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) diff --git a/mysql/__init__.py b/mysql/__init__.py new file mode 100644 index 0000000..7c68785 --- /dev/null +++ b/mysql/__init__.py @@ -0,0 +1 @@ +# -*- coding: utf-8 -*- \ No newline at end of file diff --git a/mysql/mmysql.py b/mysql/mmysql.py new file mode 100644 index 0000000..9f1cabc --- /dev/null +++ b/mysql/mmysql.py @@ -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"') diff --git a/redis/__init__.py b/redis/__init__.py new file mode 100644 index 0000000..7c68785 --- /dev/null +++ b/redis/__init__.py @@ -0,0 +1 @@ +# -*- coding: utf-8 -*- \ No newline at end of file diff --git a/redis/myredis.py b/redis/myredis.py new file mode 100644 index 0000000..912871e --- /dev/null +++ b/redis/myredis.py @@ -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 diff --git a/server.py b/server.py new file mode 100644 index 0000000..233facb --- /dev/null +++ b/server.py @@ -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/') + +if __name__ == '__main__': + app.run(debug=True, port=8888)