from gevent import monkey from gevent.pywsgi import WSGIServer from gevent import signal as geventsig import gevent from flask import Flask import base64 from io import BytesIO from matplotlib.figure import Figure import json from DataCenter import dataCenter from MchDataCenter import mchDataCenter # from plog import initLog from flask import request, jsonify import logging from logging.handlers import RotatingFileHandler import time import signal as sig import sys, getopt app = Flask(__name__) app.debug = True curname = __name__ logging.basicConfig(filename='/var/www/html/data/log/flask.log', format='%(levelname)10s %(asctime)s %(name)10s %(thread)d %(message)s', level=logging.DEBUG) logger = logging.getLogger('plot') from refill import ChannelPainter,MerchantPainter from refill import filter_chname,filter_cardtype,filter_mchids def parse_parmeter(): end_time = request.args.get('end_time') end_time = None if end_time is None else int(end_time.strip()) start_time = request.args.get('start_time') start_time = None if start_time is None else int(start_time.strip()) card_types = request.args.get('card_types') card_types = filter_cardtype(card_types) spec = request.args.get('spec') if spec is not None: spec = int(spec.strip()) filter_wave = request.args.get('filter_wave') if filter_wave is not None: filter_wave = int(filter_wave.strip()) return start_time,end_time,card_types,spec,filter_wave def onError(ex): logger.error(ex) data = base64.b64encode(b'').decode("ascii") return f"" @app.route('/plot/ch_ratio') def ch_ratio(): try: logger.debug('start chratio') start_time, end_time, card_types, spec, filter_wave = parse_parmeter() chnames = request.args.get('chnames') chnames = filter_chname(chnames) painter = ChannelPainter(start_time=start_time, end_time=end_time, chnames=chnames, card_types=card_types, spec=spec, filter_wave=filter_wave) buf = painter.paint() data = base64.b64encode(buf.getbuffer()).decode("ascii") return f"" except Exception as ex: return onError(ex) @app.route('/plot/mch_ratio') def mch_ratio(): try: logger.debug('start mchratio') start_time, end_time, card_types, spec, filter_wave = parse_parmeter() mchids = request.args.get('mchids') mchids = filter_mchids(mchids) painter = MerchantPainter(start_time=start_time, end_time=end_time, mchids=mchids, card_types=card_types, spec=spec, filter_wave=filter_wave) buf = painter.paint_ratios() data = base64.b64encode(buf.getbuffer()).decode("ascii") return f"" except Exception as ex: return onError(ex) @app.route('/plot/mch_order_send') def mch_order_send(): try: logger.debug('start mch_order_send') start_time, end_time, card_types, spec, filter_wave = parse_parmeter() mchids = request.args.get('mchids') mchids = filter_mchids(mchids) painter = MerchantPainter(start_time=start_time, end_time=end_time, mchids=mchids, card_types=card_types, spec=spec, filter_wave=filter_wave) buf = painter.paint_refilling() data = base64.b64encode(buf.getbuffer()).decode("ascii") return f"" except Exception as ex: return onError(ex) @app.route('/plot/index') def index(): app.logger.debug('start') time_stamp = request.args.get('time_stamp') interval = request.args.get('interval') chname = request.args.get('chname') quality = request.args.get('quality') card_type = request.args.get('card_type') amount = request.args.get('amount') app.logger.info('time_stamp=%s interval= %s chname=%s quality=%s card_type=%s amount=%s', time_stamp, interval, chname, quality, card_type, amount) if time_stamp is None: time_stamp = time.time() else: time_stamp = int(time_stamp) if interval is None: interval = 300 else: interval = int(interval) buf = dataCenter.draw_plot(time_stamp, interval=interval, chname=chname, quality=quality, card_type=card_type, amount=amount) data = base64.b64encode(buf.getbuffer()).decode("ascii") return f"" @app.route('/plot/days') def days(): s_time = time.time() dates = dataCenter.days() e_time = time.time() print('time=', e_time - s_time) dates.reverse() dates = dates[0:30] return jsonify(dates) @app.route('/plot/paths') def paths(): time_stamp = request.args.get('time_stamp') time_stamp = int(time_stamp) paths = dataCenter.paths(time_stamp) return jsonify(paths) @app.route('/plot/mchdays') def mchdays(): dates = mchDataCenter.days() dates.reverse() dates = dates[0:30] return jsonify(dates) @app.route('/plot/mchpaths') def mchpaths(): time_stamp = request.args.get('time_stamp') time_stamp = int(time_stamp) paths = mchDataCenter.paths(time_stamp) return jsonify(paths) @app.route('/plot/mchplot') def mchplot(): time_stamp = request.args.get('time_stamp') interval = request.args.get('interval') mchid = request.args.get('mchid') quality = request.args.get('quality') card_type = request.args.get('card_type') amount = request.args.get('amount') app.logger.info('time_stamp=%s interval= %s chname=%s quality=%s card_type=%s amount=%s', time_stamp, interval, mchid, quality, card_type, amount) if time_stamp is None: time_stamp = time.time() else: time_stamp = int(time_stamp) if interval is None: interval = 300 else: interval = int(interval) buf = mchDataCenter.draw_plot(time_stamp, interval=interval, mchid=mchid, quality=quality, card_type=card_type, amount=amount) data = base64.b64encode(buf.getbuffer()).decode("ascii") return f"" if __name__ == "__main__": debug_mode = False if debug_mode: app.run(debug=True, host='0.0.0.0', port=5000) else: from gevent import monkey from gevent.pywsgi import WSGIServer from gevent import signal as geventsig monkey.patch_all() http_server = WSGIServer(('0.0.0.0', 5000), app) geventsig.signal(sig.SIGTERM, lambda: http_server.stop()) geventsig.signal(sig.SIGINT, lambda: http_server.stop()) http_server.serve_forever()