http.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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. # def isready(self):
  21. # return self.file_length > 0
  22. def format(self,_response):
  23. _mimetype= _response.headers['Content-Type']
  24. if _mimetype == 'text/csv' or 'text/csv':
  25. _content = _response.text
  26. return pd.read_csv(StringIO(_content))
  27. #
  28. # @TODO: Add support for excel, JSON and other file formats that fit into a data-frame
  29. #
  30. return _response.text
  31. def read(self,**_args):
  32. if self._headers :
  33. r = requests.get(self._url,headers = self._headers)
  34. else:
  35. r = requests.get(self._url,headers = self._headers)
  36. return self.format(r)
  37. class Writer:
  38. """
  39. This class is designed to submit data to an endpoint (url)
  40. """
  41. def __init__(self,**_args):
  42. """
  43. @param key required session key
  44. """
  45. self._url = _args['url']
  46. self._name = _args['name']
  47. self._method = 'post' if 'method' not in _args else _args['method']
  48. # self.session = params['queue']
  49. # self.session['sql'] = []
  50. # self.session['csv'] = []
  51. # self.tablename = re.sub('..+$','',params['filename'])
  52. # self.session['uid'] = params['uid']
  53. #self.xchar = params['xchar']
  54. def format_sql(self,row):
  55. values = "','".join([col.replace('"','').replace("'",'') for col in row])
  56. return "".join(["INSERT INTO :table VALUES('",values,"');\n"]).replace(':table',self.tablename)
  57. def isready(self):
  58. return True
  59. def write(self,_data,**_args):
  60. #
  61. #
  62. _method = self._method if 'method' not in _args else _args['method']
  63. _method = _method.lower()
  64. _mimetype = 'text/csv'
  65. if type(_data) == dict :
  66. _mimetype = 'application/json'
  67. _content = _data
  68. else:
  69. _content = _data.to_dict(orient='records')
  70. _headers = {'Content-Type':_mimetype}
  71. _pointer = getattr(requests,_method)
  72. _pointer ({self._name:_content},headers=_headers)
  73. # label = params['label']
  74. # row = params ['row']
  75. # if label == 'usable':
  76. # self.session['csv'].append(self.format(row,','))
  77. # self.session['sql'].append(self.format_sql(row))