app.py 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. from gevent import monkey
  2. from gevent.pywsgi import WSGIServer
  3. from gevent import signal as geventsig
  4. import gevent
  5. from flask import Flask
  6. import base64
  7. from io import BytesIO
  8. from matplotlib.figure import Figure
  9. import json
  10. from DataCenter import dataCenter
  11. from MchDataCenter import mchDataCenter
  12. # from plog import initLog
  13. from flask import request, jsonify
  14. import logging
  15. from logging.handlers import RotatingFileHandler
  16. import time
  17. import signal as sig
  18. import sys, getopt
  19. app = Flask(__name__)
  20. app.debug = True
  21. curname = __name__
  22. logging.basicConfig(filename='/var/www/html/data/log/flask.log',
  23. format='%(levelname)10s %(asctime)s %(name)10s %(thread)d %(message)s',
  24. level=logging.DEBUG)
  25. logger = logging.getLogger('plot')
  26. from refill import ChannelPainter,MerchantPainter
  27. from refill import filter_chname,filter_cardtype,filter_mchids
  28. def parse_parmeter():
  29. end_time = request.args.get('end_time')
  30. end_time = None if end_time is None else int(end_time.strip())
  31. start_time = request.args.get('start_time')
  32. start_time = None if start_time is None else int(start_time.strip())
  33. card_types = request.args.get('card_types')
  34. card_types = filter_cardtype(card_types)
  35. spec = request.args.get('spec')
  36. if spec is not None:
  37. spec = int(spec.strip())
  38. filter_wave = request.args.get('filter_wave')
  39. if filter_wave is not None:
  40. filter_wave = int(filter_wave.strip())
  41. return start_time,end_time,card_types,spec,filter_wave
  42. def onError(ex):
  43. logger.error(ex)
  44. data = base64.b64encode(b'').decode("ascii")
  45. return f"<img src='data:image/png;base64,{data}'/>"
  46. @app.route('/plot/ch_ratio')
  47. def ch_ratio():
  48. try:
  49. logger.debug('start chratio')
  50. start_time, end_time, card_types, spec, filter_wave = parse_parmeter()
  51. chnames = request.args.get('chnames')
  52. chnames = filter_chname(chnames)
  53. painter = ChannelPainter(start_time=start_time, end_time=end_time, chnames=chnames, card_types=card_types, spec=spec, filter_wave=filter_wave)
  54. buf = painter.paint()
  55. data = base64.b64encode(buf.getbuffer()).decode("ascii")
  56. return f"<img src='data:image/png;base64,{data}'/>"
  57. except Exception as ex:
  58. return onError(ex)
  59. @app.route('/plot/mch_ratio')
  60. def mch_ratio():
  61. try:
  62. logger.debug('start mchratio')
  63. start_time, end_time, card_types, spec, filter_wave = parse_parmeter()
  64. mchids = request.args.get('mchids')
  65. mchids = filter_mchids(mchids)
  66. painter = MerchantPainter(start_time=start_time, end_time=end_time, mchids=mchids, card_types=card_types, spec=spec, filter_wave=filter_wave)
  67. buf = painter.paint_ratios()
  68. data = base64.b64encode(buf.getbuffer()).decode("ascii")
  69. return f"<img src='data:image/png;base64,{data}'/>"
  70. except Exception as ex:
  71. return onError(ex)
  72. @app.route('/plot/mch_order_send')
  73. def mch_order_send():
  74. try:
  75. logger.debug('start mch_order_send')
  76. start_time, end_time, card_types, spec, filter_wave = parse_parmeter()
  77. mchids = request.args.get('mchids')
  78. mchids = filter_mchids(mchids)
  79. painter = MerchantPainter(start_time=start_time, end_time=end_time, mchids=mchids, card_types=card_types, spec=spec, filter_wave=filter_wave)
  80. buf = painter.paint_refilling()
  81. data = base64.b64encode(buf.getbuffer()).decode("ascii")
  82. return f"<img src='data:image/png;base64,{data}'/>"
  83. except Exception as ex:
  84. return onError(ex)
  85. @app.route('/plot/index')
  86. def index():
  87. app.logger.debug('start')
  88. time_stamp = request.args.get('time_stamp')
  89. interval = request.args.get('interval')
  90. chname = request.args.get('chname')
  91. quality = request.args.get('quality')
  92. card_type = request.args.get('card_type')
  93. amount = request.args.get('amount')
  94. app.logger.info('time_stamp=%s interval= %s chname=%s quality=%s card_type=%s amount=%s',
  95. time_stamp, interval, chname, quality, card_type, amount)
  96. if time_stamp is None:
  97. time_stamp = time.time()
  98. else:
  99. time_stamp = int(time_stamp)
  100. if interval is None:
  101. interval = 300
  102. else:
  103. interval = int(interval)
  104. buf = dataCenter.draw_plot(time_stamp,
  105. interval=interval,
  106. chname=chname,
  107. quality=quality,
  108. card_type=card_type,
  109. amount=amount)
  110. data = base64.b64encode(buf.getbuffer()).decode("ascii")
  111. return f"<img src='data:image/png;base64,{data}'/>"
  112. @app.route('/plot/days')
  113. def days():
  114. s_time = time.time()
  115. dates = dataCenter.days()
  116. e_time = time.time()
  117. print('time=', e_time - s_time)
  118. dates.reverse()
  119. dates = dates[0:30]
  120. return jsonify(dates)
  121. @app.route('/plot/paths')
  122. def paths():
  123. time_stamp = request.args.get('time_stamp')
  124. time_stamp = int(time_stamp)
  125. paths = dataCenter.paths(time_stamp)
  126. return jsonify(paths)
  127. @app.route('/plot/mchdays')
  128. def mchdays():
  129. dates = mchDataCenter.days()
  130. dates.reverse()
  131. dates = dates[0:30]
  132. return jsonify(dates)
  133. @app.route('/plot/mchpaths')
  134. def mchpaths():
  135. time_stamp = request.args.get('time_stamp')
  136. time_stamp = int(time_stamp)
  137. paths = mchDataCenter.paths(time_stamp)
  138. return jsonify(paths)
  139. @app.route('/plot/mchplot')
  140. def mchplot():
  141. time_stamp = request.args.get('time_stamp')
  142. interval = request.args.get('interval')
  143. mchid = request.args.get('mchid')
  144. quality = request.args.get('quality')
  145. card_type = request.args.get('card_type')
  146. amount = request.args.get('amount')
  147. app.logger.info('time_stamp=%s interval= %s chname=%s quality=%s card_type=%s amount=%s',
  148. time_stamp, interval, mchid, quality, card_type, amount)
  149. if time_stamp is None:
  150. time_stamp = time.time()
  151. else:
  152. time_stamp = int(time_stamp)
  153. if interval is None:
  154. interval = 300
  155. else:
  156. interval = int(interval)
  157. buf = mchDataCenter.draw_plot(time_stamp, interval=interval, mchid=mchid, quality=quality, card_type=card_type,
  158. amount=amount)
  159. data = base64.b64encode(buf.getbuffer()).decode("ascii")
  160. return f"<img src='data:image/png;base64,{data}'/>"
  161. if __name__ == "__main__":
  162. debug_mode = False
  163. if debug_mode:
  164. app.run(debug=True, host='0.0.0.0', port=5000)
  165. else:
  166. from gevent import monkey
  167. from gevent.pywsgi import WSGIServer
  168. from gevent import signal as geventsig
  169. monkey.patch_all()
  170. http_server = WSGIServer(('0.0.0.0', 5000), app)
  171. geventsig.signal(sig.SIGTERM, lambda: http_server.stop())
  172. geventsig.signal(sig.SIGINT, lambda: http_server.stop())
  173. http_server.serve_forever()