Llevo un tiempo sin pasar por aquí y se me ha ocurrido compartir una prueba que hice el otro día de crear una api rest y web con python.
No he añadido los imports porque son clases que solo devuelven texto.
Las declaraciones @app.route(«/XXX») equivalen a las llamadas que se le hace a la api y hay varios casos. Solo ejecutar como por ejemplo el de /info o el que hace consulta pasándole parámetros de entrada.
El resultado se puede pasar en formato html (ahi podría haber una página completa con sus estilos y todo) o un json al estilo ApiRest.
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys, os
sys.path.append("/home/pi/python/source/")
from flask import Flask, redirect, url_for, jsonify
from gpiozero import CPUTemperature
import apiRest.infoRoute as infoR
import apiRest.searchGame as searchG
import psutil
"""--------------------------------------------------------------------------------------------------------------------------------------------
INICIO DE LA APP FLASK
--------------------------------------------------------------------------------------------------------------------------------------------"""
app = Flask(__name__)
@app.route("/")
def home():
return "<H1>Esta es la página principal</H1>" \
"<br><a href='info'>Información</a>"
@app.route("/info")
def info():
body = ""
claseInfo = infoR.infoRouteClass()
status, result = claseInfo.getRunningBots()
if status == 200:
if result.__len__() > 0:
body = body + "<h2>Se están ejecutando los siguientes procesos:</h2>"
for fila in result:
body = body + "<h4>{0}</h4> - {1}<br>".format(fila["name"], fila["desc"])
status, result = claseInfo.getStatsBots()
if status == 200:
if result.__len__() > 0:
body = body + "<br> <h2>Información sobre el estado de los procesos/videos publicados:</h2>"
for fila in result:
body = body + "<h3>{0}</h3> - {1}<br>".format(fila["name"], fila["desc"])
status, result = claseInfo.getFilesInfo()
if status == 200:
if result.__len__() > 0:
body = body + "<br> <h2>Información sobre ficheros:</h2>"
for fila in result:
body = body + "<h3>{0}</h3> - {1}<br>".format(fila["name"], fila["desc"])
status, result = claseInfo.getPendingGames()
if status == 200:
if result.__len__() > 0:
body = body + "<br> <h2>Juegos pendientes de buscar:</h2>"
for fila in result:
body = body + "- {0} <br>".format(fila["name"])
temperatura = CPUTemperature()
cpuStatus = psutil.cpu_percent()
mensajeCPU = "Estado CPU: {0}%".format(str(cpuStatus))
body = "<b>El equipo está a {0}º<br>{1}</b><br>".format(str(temperatura.temperature), mensajeCPU) + body
return "<H1>Esta es la página de información</H1><br>{0}".format(body)
@app.route("/searchGame/<name>")
@app.route("/searchGame/<name>/<limit>")
def searchGame(name, limit=None):
claseSearch = searchG.searchGameClass()
status, result = claseSearch.searchGame(name, limit)
return jsonify(result)
"""
IUNICIO DEL PROGRAMA
"""
if __name__ == "__main__":
from waitress import serve
serve(app, host="192.1XX.XXX.XXX", port=5000) #también se puede poner localhost
Espero que os sirva el código.