Servidor web dinámico con Python
Publicado en Diciembre de 2017No solo puede usar la Orange Pi para navegar por Internet, sino que, como ya hemos visto en proyectos anteriores, también puede actuar como servidor. Hay muchos servidores web diferentes que se pueden instalar en la Orange Pi, como los servidores web tradicionales, Apache o lighttpd, que muestran las páginas web, imágenes, vídeos o sonidos almacenados en nuestra placa.
Sin embargo, existe una nueva clase de herramientas que amplían los lenguajes de programación como Python, Ruby y JavaScript para crear servidores web que generan dinámicamente el HTML cuando reciben solicitudes HTTP desde un navegador web. Esta es una gran forma de lanzar eventos físicos, almacenar datos o verificar el valor de un sensor remoto a través de un navegador web.
Que necesitas:
Vamos a utilizar un framework web de Python llamado Flask
para convertir tu placa en un servidor web dinámico. Si bien hay muchas cosas que se pueden hacer con Flask
tal cual se instala, también admite muchas extensiones diferentes para hacer cosas, como autenticación de usuarios, generación de formularios y uso de bases de datos. También tiene acceso a la gran variedad de bibliotecas estándar de Python disponibles.
Partimos de una placa con conexión a internet y Armbiam actualizado.
Para instalar Flask, necesitarás tener instalado pip
. Si todavía no lo tienes, es fácil de hacer:
sudo apt-get install python-pip
Ya podemos instalar Flask
:
sudo pip install flask
En alguna instalación me ha dado error por no tener instalado el paquete setuptools
, así que si te da problemas, instálalo:
sudo pip install setuptools
Para probar la instalación, vamos a crear un archivo lo más básico posible. Crea una carpeta y dentro un archivo llamado test.py. Por ejemplo:
sudo mkdir testFlask cd testFlask sudo nano test.py
y dentro del archivo:
from flask import Flask app = Flask(__name__) @app.route("/") def test(): return "Esto es una prueba de servidor Flask" if __name__ == "__main__": app.run(host='0.0.0.0', port=8800, debug=True)
Es un código muy sencillo que, básicamente, mostrará la frase en el navegador cuando se acceda a la IP de la placa en el puerto 8800. He puesto este puerto, porque tengo apache
instalado y el puerto 80, que es el puerto por defecto, está ocupado, pero si tienes ese puerto libre, se puede dejar el 80. Lanza el programa con:
sudo python test.py
y verás algo como esto:
orangepi@orangepiplus2e:~/testFlask$ sudo python test.py * Running on http://0.0.0.0:8800/ (Press CTRL+C to quit) * Restarting with stat * Debugger is active! * Debugger PIN: 182-726-995
Escribe la ip de tu placa en un navegador de tu red seguido del puerto. Por ejemplo:
En el navegador podrás leer la frase "Esto es una prueba de servidor Flask". En el terminal deberás poder ver el acceso 192.168.1.19 - - [30/Nov/2017 17:35:31] "GET / HTTP/1.1" 200 -. Si es así, todo funciona. Y ahora la parte que más me gusta. Estamos ejecutando python, así que puedes lanzar cualquier código. En este caso voy a adaptar el que usamos para el sensor de temperatura y humedad y adaptándolo un poco podremos hacer lecturas via web con este servidor tan ligero y sencillo de instalar. El código que he adaptado es este:
#!/usr/bin/env python # -*- coding: iso-8859-15 -*- # author : "javier pérez santos para orangepiweb.es" # credits : "javier pérez santos, orangepiweb.es" # copyright : "Copyright 2017, orangepiweb.es" """ ___ ____ ___ __ _ / _ \ _ __ __ _ _ __ __ _ ___| _ \(_) \ / /__| |__ ___ ___ | | | | '__/ _` | '_ \ / _` |/ _ \ |_) | |\ \ /\ / / _ \ '_ \ / _ \/ __| | |_| | | | (_| | | | | (_| | __/ __/| | \ V V / __/ |_) | __/\__ \ \___/|_| \__,_|_| |_|\__, |\___|_| |_| \_/\_/ \___|_.__(_)___||___/ |___/ Servidor web dinámico con Python """ from flask import Flask, render_template from pyA20.gpio import gpio from pyA20.gpio import port import dht import time import datetime DHT22_PIN = port.PA6 gpio.init() DHT22_instance = dht.DHT22(pin=DHT22_PIN) def DHT22_read_sensor(): DHT22_result = DHT22_instance.read() DHT22_print_data(DHT22_result) app = Flask(__name__) @app.route("/") def hello(): now = datetime.datetime.now() timeString = now.strftime("%Y-%m-%d %H:%M") DHT22_result = DHT22_instance.read() sensor = 'Temperatura: {}, Humedad: {}'.format(DHT22_result.temperature, DHT22_result.humidity) templateData = { 'title' : 'Sensor DHT22', 'time': timeString, 'sensor': sensor } return render_template('main.html', **templateData) if __name__ == "__main__": app.run(host='0.0.0.0', port=8800, debug=True)
Ahora crea un directorio llamado templates
y dentro de él un fichero que usaremos como plantilla llamado main.html
. Pon este código dentro:
Ejecuta el programa python y accede de nuevo a la IP. Verás algo como esto:
Con el código javascript se refescará cada 3 segundos. Sencillo ¿no?.
Ahora puedes usarlo para lanzar eventos, leer o escribir en el GPIO, realizar lecturas de sensores, guardar los datos en base de datos... De nuevo el límite está en tu imaginación.
Espero que te haya sido de utilidad, no dudes en escribir un comentario si ves algún error o si puedo ayudarte.
Utiliza este espacio si quieres añadir algún comentario adicional o si tienes alguna duda.
No olvides añadir tu distribución y tu placa.
Todos los comentarios serán validados antes de su publicación.
Arnold
Genial, muy sencillo de usar, muy buena explicación gracias
Ricardo Reyes
Muy interesante el artículo para hacer lecturas u otra cosa en nuestra red local. Mi pregunta es, cómo podemos leer los datos desde otra red por internet?. Saludos.
Alejandro ...
Hola, soy nuevo con esto y me parecio muy interesante tus proyectos...
Estoy teniendo un problema, me esta arrojando un error import, abajo detallo.
--------------------------
root@OrangePi:~/testFlask# sudo python test.py
Traceback (most recent call last):
File "test.py", line 22, in <module>
import dht
ImportError: No module named dht
------------------------
Que puede estar pasando?
Saludos.
Administrador OrangePiWeb.es
Hola Ricardo. Supongo que lo que necesitas hacer es leer los datos de un sensor que no está instalado en tu máquina ni en tu red local. Eso puedes hacerlo con Web Services, donde la máquina que tiene el sensor instalado genera un archivo público o accediendo directamente al sensor para poder acceder a dichos datos. Saludos.
Administrador OrangePiWeb.es
Hola. El propio error te lo está diciendo:
import dht ImportError: No module named dht
No has instalado el módulo dht.
¿Has leído todo el artículo completo? ¿Has seguido los pasos del segundo artículo al que hace referencia? ¿has instalado un sensor dht? Saludos
Copyright © 2024 desde 2016. Todos los derechos reservados | Diseño JaviPSantos