jueves, 17 de octubre de 2019

REST Api con Python y Flask

El siguiente script crea una REST Api de ejemplo usando la librería Flask de Python. Esta Api tiene dos metodos:

1.
postJsonHandler():
Con el metodo POST, esta función permite recibir informacion en formato json y la guarda en un tabla de postgresql. El body del post es así:
{
    "device_id": 4,
    "temperature":17,
    "humidity": 23,
    "occupied":1
}


2.
GetJsonHandler():
Con el metodo GET esta función permite recuperar el ultimo registro guardado en la tabla en formato json.

NOTA: Para consultar el clima usando la api OPenWeatherMap ver nota publicada AQUI

Conceptualmente el flujo de la api es así:












python script:
from flask import Flask
from flask import request
import psycopg2
import time
import pandas as pd
import pandas.io.sql as psql
import pyodbc 
import requests
import os

def get_sql_insert(table, columns, values):
      return 'INSERT INTO ' + table + ' (' + columns + ') VALUES (' + values + ');'

def get_sql_data(table):
    sql_query = 'select * from ' + table + ' order by creation_date desc limit 1;'
    conn = get_sql_conn()
    df = psql.read_sql(sql_query, conn)
    conn.close()
    return df

def get_sql_conn():
    conn = psycopg2.connect(database="demo_database", 
            user="postgres", 
            password="postgres", 
            host="127.0.0.1", port="5432")
    return conn

def get_sql_query(input_json):
    table = 'demo1'
    columns = "device_id, temperature, humidity, occupied, creation_date"
    values = ', '.join(str(value) for key, value in input_json.items())
    return get_sql_insert(table, columns, values)

def sql_commit(sql_query):
    try:
        conn = get_sql_conn()
        cur = conn.cursor()
        cur.execute(sql_query)
        conn.commit()
    except (Exception, psycopg2.DatabaseError) as error:
        print(error)
    finally:
        if conn is not None:
            conn.close()        

def get_input(content):
    input_i = {
    "device_id": content['device_id'],
    "temperature": content['temperature'],
    "humidity": content['humidity'],
    "occupied": content['occupied'],
    "creation_date": int(time.time())
    }
    return input_i

app = Flask(__name__)

@app.route("/")
def hello():
    return "Flask server for Iot Demo..."

@app.route('/postjson', methods = ['POST'])
def postJsonHandler():
    input_i = get_input(request.get_json())
    sql_commit(get_sql_query(input_i))
    print (input_i)
    return 'JSON posted'

@app.route('/getjson', methods = ['GET'])
def GetJsonHandler():
    df = get_sql_data('demo1')
    return df.to_json(orient='records')


if __name__ == '__main__':
    app.run(host='0.0.0.0', port= 5000)


Referencias:
Ejemplo de proyecto IoT
https://www.balena.io/blog/build-an-environment-and-air-quality-monitor-with-raspberry-pi/

Deteccion de Anomalia en Temperatura
https://www.kaggle.com/victorambonati/unsupervised-anomaly-detection/

Notas sobre postgresql y Python
http://www.postgresqltutorial.com/postgresql-python/insert/

Notas sobre Api con Flask
http://migueleonardortiz.com.ar/rest/como-crear-un-api-con-python-flask-y-mongodb/1952


No hay comentarios:

Publicar un comentario