plot_control.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. from flask import Flask, request, jsonify
  2. app = Flask(__name__)
  3. import base64
  4. from io import BytesIO
  5. from matplotlib.figure import Figure
  6. import json
  7. import logging
  8. import time
  9. import signal as sig
  10. import sys, getopt
  11. import re
  12. from refill import ChannelPainter
  13. from refill import day_stamp,time_border
  14. logging.basicConfig(filename='/var/www/html/data/log/flask.log',
  15. format='%(levelname)10s %(asctime)s %(name)10s %(thread)d %(message)s',
  16. level=logging.DEBUG)
  17. logger = logging.getLogger('plot')
  18. def filter_chname(chnames):
  19. if chnames is not None:
  20. chnames = chnames.strip()
  21. if chnames is None or len(chnames) == 0:
  22. chnames = set()
  23. else:
  24. items = re.split(r',', chnames)
  25. names = [name.strip() for name in items]
  26. namelist = []
  27. for name in names:
  28. if len(name) > 0:
  29. namelist.append(name)
  30. chnames = set(namelist)
  31. return chnames
  32. def filter_cardtype(card_types):
  33. if card_types is not None:
  34. card_types = card_types.strip()
  35. if card_types is None or len(card_types) == 0:
  36. result = {4, 5, 6} #默认话费类型
  37. else:
  38. items = re.split(r',', card_types)
  39. stypes = [type.strip() for type in items]
  40. types = []
  41. for stype in stypes:
  42. try:
  43. type = int(stype)
  44. types.append(type)
  45. except Exception as ex:
  46. logger.error(ex)
  47. result = set(types)
  48. return result
  49. @app.route('/plot/ch_ratio')
  50. def ch_ratio():
  51. try:
  52. logger.debug('start chratio')
  53. cur_time = int(time.time())
  54. start_time = int(request.args.get('start_time') or (cur_time - 7200))
  55. end_time = int(request.args.get('end_time') or cur_time)
  56. chnames = request.args.get('chnames') or None
  57. chnames = filter_chname(chnames)
  58. card_types = request.args.get('card_types') or None
  59. card_types = filter_cardtype(card_types)
  60. spec = request.args.get('spec') or None
  61. if spec is not None:
  62. spec = int(spec.strip())
  63. painter = ChannelPainter(start_time=start_time, end_time=end_time, chnames=chnames, card_types=card_types, spec=spec)
  64. buf = painter.paint()
  65. data = base64.b64encode(buf.getbuffer()).decode("ascii")
  66. return f"<img src='data:image/png;base64,{data}'/>"
  67. except Exception as ex:
  68. logger.error(ex)
  69. return f"<img src='data:image/png;base64,{[]}'/>"
  70. if __name__ == "__main__":
  71. debug_mode = True
  72. if debug_mode:
  73. app.run(debug=True, host='0.0.0.0', port=5000)
  74. else:
  75. from gevent import monkey
  76. from gevent.pywsgi import WSGIServer
  77. from gevent import signal as geventsig
  78. monkey.patch_all()
  79. http_server = WSGIServer(('0.0.0.0', 5000), app)
  80. geventsig.signal(sig.SIGTERM, lambda: http_server.stop())
  81. geventsig.signal(sig.SIGINT, lambda: http_server.stop())
  82. http_server.serve_forever()