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()