¿Nos ayudas a pagar el Hosting?

Compartir en facebook Compartir en twitter Compartir en linkedin

Servidor web dinámico con Python

Publicado en Diciembre de 2017

No 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:

Servidor python con Flask y Orange Pi

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:

Servidor python con Flask y Orange Pi

Ejecuta el programa python y accede de nuevo a la IP. Verás algo como esto:

Servidor python con Flask y Orange Pi

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


Nombre*

Email* Nunca será publicado ni compartido

Comentario*



Copyright © 2024 desde 2016. Todos los derechos reservados | Diseño JaviPSantos

Solicitamos su permiso para obtener datos estadísticos de su navegación en esta web, en cumplimiento del Real Decreto-ley 13/2012. Si continúa navegando consideramos que acepta el uso de cookies.

OK | Más información