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, get_channels, get_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) return jsonify({'state': 'fail'}) @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, ratios = painter.paint() data = base64.b64encode(buf.getbuffer()).decode("ascii") return jsonify({'img': data, 'ratios': ratios, 'state': 'success'}) except Exception as ex: return onError(ex) @app.route('/plot/channels') def channels(): try: channels = get_channels() return jsonify(channels) except Exception as ex: logger.error(ex) return jsonify([]) @app.route('/plot/mchids') def mchids(): try: mchids = get_mchids() return jsonify(mchids) except Exception as ex: logger.error(ex) return jsonify([]) @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, ratios = painter.paint_ratios() data = base64.b64encode(buf.getbuffer()).decode("ascii") return jsonify({'img': data, 'ratios': ratios, 'state': 'success'}) 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, mchids = painter.paint_refilling() data = base64.b64encode(buf.getbuffer()).decode("ascii") return jsonify({'img': data, 'mchids': mchids, 'state': 'success'}) 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 = True 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()