13 de noviembre de 2024

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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *