September 1, 2014

How to Record Data

I know it's Labor Day and what-nots and I'm supposed to be celebrating the end of Burning man, being at a bar-be-queue, but I'm not. Instead, I'm tweaking things, bringing me to what I just accomplished -- a flask-based REST API to data, in python, naturally:

from backports import lzma
import cStringIO as StringIO
import csv
import datetime
from flask import Flask, request, Response
import json

# TODO force SSL for post -- http://flask.pocoo.org/snippets/111/

DATA_FILE = 'sanguine.csv.xz'
app = Flask(__name__)

@app.route('/', methods = ['GET'])
def index():
    with lzma.LZMAFile(DATA_FILE, 'r') as data:
        output = StringIO.StringIO()
        reader = csv.DictReader(data, fieldnames=['Timestamp','User','Latitude','Longitude'], quoting=csv.QUOTE_MINIMAL, lineterminator='\r\n')
        reader.next() # skip header line
        return(Response(json.dumps(list(reader)), mimetype='application/json'))

@app.route('/', methods=['POST'])
def newdatapiece():
    with lzma.LZMAFile(DATA_FILE, 'a') as data:
        writer = csv.DictWriter(data, fieldnames=['Timestamp','User', 'Latitude','Longitude'], quoting = csv.QUOTE_MINIMAL, lineterminator='\r\n')
        row = {}
        row['Timestamp'] = datetime.datetime.now().strftime('%s')
        row['User'] = request.form['user_id']
        row['Latitude'] = request.form['lat']
        row['Longitude'] = request.form['lon']
        writer.writerow(row)
    return '', 201

@app.route('/analyze', methods=['GET']) 
def analysis():
    lines = []
    with lzma.LZMAFile(DATA_FILE, 'r') as data:
        lines = data.readlines()
    return(Response(lines, mimetype='application/csv'))

if __name__ == '__main__':
    with lzma.LZMAFile(DATA_FILE, 'w') as data:
        writer = csv.DictWriter(data, fieldnames=['Timestamp','User', 'Latitude','Longitude'], quoting = csv.QUOTE_MINIMAL, lineterminator='\r\n')
        writer.writeheader()
    app.run(host='0.0.0.0', port=8080, debug=True)

No comments:

Post a Comment