http.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. from flask import request, session
  2. from datetime import datetime
  3. import re
  4. # from transport.common import Reader, Writer
  5. import json
  6. import requests
  7. from io import StringIO
  8. import pandas as pd
  9. def template():
  10. return {'url':None, 'headers':{'key':'value'}}
  11. class Reader:
  12. """
  13. This class is designed to read data from an Http request file handler provided to us by flask
  14. The file will be heald in memory and processed accordingly
  15. NOTE: This is inefficient and can crash a micro-instance (becareful)
  16. """
  17. def __init__(self,**_args):
  18. self._url = _args['url']
  19. self._headers = None if 'headers' not in _args else _args['headers']
  20. self._data = None if 'data' not in _args else _args['data']
  21. self._method = 'get' if 'method' not in _args else _args['method'].lower()
  22. # def isready(self):
  23. # return self.file_length > 0
  24. def format(self,_response):
  25. _mimetype= _response.headers['Content-Type']
  26. if 'text/plain' in _mimetype or 'text/csv' in _mimetype:
  27. _content = _response.text
  28. return pd.read_csv(StringIO(_content))
  29. #
  30. # @TODO: Add support for excel, JSON and other file formats that fit into a data-frame
  31. #
  32. return _response.text
  33. def get (self,key,_args):
  34. """
  35. This function inspects an argument and tries to determine if the corresponding attribute is set
  36. i.e the attribute will be prefixed by underscore
  37. """
  38. _attr = f'_{key}'
  39. return _args[key] if key in _args else (getattr(self,_attr) if hasattr(self,_attr) else None)
  40. def read(self,**_args):
  41. _method = self.get('method',_args)
  42. _headers = self.get('headers',_args)
  43. _data = self.get('data',_args)
  44. _url = self.get('url',_args)
  45. _requestPpointer = getattr(requests,_method)
  46. _resp = _requestPpointer(_url,headers=_headers,data=_data)
  47. return self.format(_resp)
  48. # if self._headers :
  49. # r = requests.get(self._url,headers = self._headers)
  50. # else:
  51. # r = requests.get(self._url,headers = self._headers)
  52. # return self.format(r)
  53. class Writer:
  54. """
  55. This class is designed to submit data to an endpoint (url)
  56. """
  57. def __init__(self,**_args):
  58. """
  59. @param key required session key
  60. """
  61. self._url = _args['url']
  62. self._name = _args['name']
  63. self._method = 'post' if 'method' not in _args else _args['method']
  64. # self.session = params['queue']
  65. # self.session['sql'] = []
  66. # self.session['csv'] = []
  67. # self.tablename = re.sub('..+$','',params['filename'])
  68. # self.session['uid'] = params['uid']
  69. #self.xchar = params['xchar']
  70. def format_sql(self,row):
  71. values = "','".join([col.replace('"','').replace("'",'') for col in row])
  72. return "".join(["INSERT INTO :table VALUES('",values,"');\n"]).replace(':table',self.tablename)
  73. def isready(self):
  74. return True
  75. def write(self,_data,**_args):
  76. #
  77. #
  78. _method = self._method if 'method' not in _args else _args['method']
  79. _method = _method.lower()
  80. _mimetype = 'text/csv'
  81. if type(_data) == dict :
  82. _mimetype = 'application/json'
  83. _content = _data
  84. else:
  85. _content = _data.to_dict(orient='records')
  86. _headers = {'Content-Type':_mimetype}
  87. _pointer = getattr(requests,_method)
  88. _pointer ({self._name:_content},headers=_headers)
  89. # label = params['label']
  90. # row = params ['row']
  91. # if label == 'usable':
  92. # self.session['csv'].append(self.format(row,','))
  93. # self.session['sql'].append(self.format_sql(row))