- Fuente "Aplicación de Datos"
- Necesario instalación de entrada anterior "Python, Django, pip y virtualenvs en Ubuntu"
- Codigo fuente en github
Flask un micro framework para crear aplicaciones web en python. Usar pip para instalar Flask
$ pip install Flask
Crear directorio en donde pondremos archivos con código de la aplicación
$ mkdir mi-app
Adentro crear archivo llamado app.py, donde configuremos Flask y servira como backend de nuestro proyecto. Abrir app.py en un editor
from flask import Flask
app = Flask(__name__)
Configurar para hacer la raíz de tu sitio. Usaremos un archivo llamado 'index.html' para colocar la información. Tenemos que especificarlo en app.py
from flask import Flask
from flask import render_template
app = Flask(__name__)
@app.route("/")
def index():
return render_template('index.html')
Crear directorio "templates" dentro del directorio de nuestro proyecto.
$ mkdir templates
Crear "index.html" dentro del directorio "templates" y colocarle cualquier texto.
¡Hola Mundo!
Volver a editar app.py y agregarle lo siguiente para poder levantar el servidor local de Flask
from flask import Flask
from flask import render_template
app = Flask(__name__)
@app.route("/")
def index():
return render_template('index.html')
if __name__ == '__main__':
app.run(
host="0.0.0.0",
port=8000,
use_reloader=True,
debug=True,
)
Correr app.py en la linea de comandos. Mirar el resultado en un navegador en http://localhost:8000
$ python app.py
Comenzar nuevamente editando "index.html". Reemplazar el contenido por el esqueleto de un archivo HTML
Incendios en España entre 2004 y 2014
Crear directorio para guardar archivos estáticos. Aqui guardaremos el CSV con nuestros datos. Descargalo
$ mkdir static
Abrir app.py en editor de texto. Usaremos libreria csv para acceder a nuestros datos y pasarle la lista de datos del csv a index.html
from flask import Flask
from flask import render_template
app = Flask(__name__)
csv_path = './static/incendios.csv'
csv_obj = csv.DictReader(open(csv_path, 'r'))
csv_list = list(csv_obj)
@app.route("/")
def index():
return render_template('index.html',
object_list=csv_list,
)
if __name__ == '__main__':
app.run(
host="0.0.0.0",
port=8000,
use_reloader=True,
debug=True,
)
Guardar app.py y editar index.html. Colocar la lista del csv en el index.html. En linea de comandos correr app.py y visitar http://localhost:8000 nuevamente
Incendios en España entre 2004 y 2014
{{ object_list }}
Vamos a darle formato a los datos en index.html. Estamos usando el lenguaje de templating jinja de Flask
Incendios en España entre 2004 y 2014
IDPIF
Superficie Forestal Quemada
Fecha
Muertos
Heridos
Comunidad
Provincia
Comarca
Causa
Perdidas
{% for obj in object_list %}
{{ obj['IDPIF'] }}
{{ obj['SUPQUEMADA'] }}
{{ obj['FECHA'] }}
{{ obj['MUERTOS'] }}
{{ obj['HERIDOS'] }}
{{ obj['COMUNIDAD'].decode('UTF-8') }}
{{ obj['PROVINCIA'].decode('UTF-8') }}
{{ obj['COMARCA'].decode('UTF-8') }}
{{ obj['CAUSA'].decode('UTF-8') }}
{{ obj['PERDIDAS'] }}
{% endfor %}
Ahora página de detalles por incendio. Agregamos una nueva ruta en archivo "app.py"
@app.route('//')
def detail(number):
return render_template('detail.html')
Agreguemos el template "detail.html". Editamos el archivo detail.html. Agregar algo simple. Y levantamos la página en el navegador con cualquier número. http://localhost:8000/2004210126/
¡Hola Detalle!
Buscamos el incendio. Conectamos el número en la URL con el número identificador real del incendio en el CSV. Editamos app.py y convertimos la lista que tenemos en algo donde el incendio sea fácilmente buscable por identificador.
Editamos la función detail en app.py para que conecte el número en la URL con el registro correspondiente. Quedaría:
import csv
from flask import Flask
from flask import render_template
app = Flask(__name__)
csv_path = './static/incendios.csv'
csv_obj = csv.DictReader(open(csv_path, 'r'))
csv_list = list(csv_obj)
csv_dict = dict([[o['IDPIF'], o] for o in csv_list])
@app.route("/")
def index():
return render_template('index.html',
object_list=csv_list,
)
@app.route('//')
def detail(number):
return render_template('detail.html',
object=csv_dict[number],
)
if __name__ == '__main__':
app.run(
host="0.0.0.0",
port=8000,
use_reloader=True,
debug=True,
)
Volver a editar detail.html para agregarle datos desde nuestro CSV
{{ object['COMUNIDAD'].decode('UTF-8') }}
Editar "index.html" para enlazar la página del incendio. En la tag table reemplazar la fila de
{{ obj['IDPIF'] }}
Agregar el resto de los campos del incendio en detail.html
Incendio de {{ object['COMUNIDAD'].decode('UTF-8') }}
En la comunidad {{ object['COMUNIDAD'].decode('UTF-8') }}, provincia {{ object['PROVINCIA'].decode('UTF-8') }}, comarca {{ object['COMARCA'].decode('UTF-8') }}, municipio {{ object['MUNICIPIO'].decode('UTF-8') }} se quemó una superficie forestal de {{ object['SUPQUEMADA'] }}. Hubieron {{ object['MUERTOS'] }} muertos y {{ object['HERIDOS'] }} heridos. Se detectó en la fecha {{ object['FECHA'] }}. Se pudo controlar en {{ object['TIME_CTRL'] }} minutos y extinguir en {{ object['TIME_EXT'] }} minutos. La causa del incendio fue {{ object['CAUSA'].decode('UTF-8') }}. En la extinción del incendio participaron {{ object['PERSONAL'] }} personas, {{ object['PESADOS'] }} vehiculos pesados y {{ object['AEREOS'] }} medios aereos.
Javascript. Ahora vamos a colocar un mapa con los incendios usando una libreria de Javascript llamada Leaflet. Primero hay que importarla en el archivo "index.html"
...
Crear un elemento HTML para el mapa
...
Incendios en España entre 2004 y 2014
...
Y usar Leaflet para centrarlo en España. Inicializamos el mapa con las coordenadas de España y nivel de zoom
Agregamos la capa de tiles desde mapquest, que utiliza open street map. Se le pasa la URL para las imagenes de tiles, el nivel máximo de zoom (18) y el texto sobre de donde vienen los mapas.
Le agregamos el layer al elemento del mapa
Transformar los datos del CSV que tenemos a GeoJSON. GeoJSON es un formato para guardar estructuras de datos geograficos junto a información no geografica
Agregar una ventanita popup que muestre información sobre el incendio. Sustituir var dataLayer
Hacemos lo mismo en "detail.html" agregamos un mapa del incendio. Quedaria:
Incendio de {{ object['COMUNIDAD'].decode('UTF-8') }}
En la comunidad {{ object['COMUNIDAD'].decode('UTF-8') }}, provincia {{ object['PROVINCIA'].decode('UTF-8') }}, comarca {{ object['COMARCA'].decode('UTF-8') }}, municipio {{ object['MUNICIPIO'].decode('UTF-8') }} se quemó una superficie forestal de {{ object['SUPQUEMADA'] }}. Hubieron {{ object['MUERTOS'] }} muertos y {{ object['HERIDOS'] }} heridos. Se detectó en la fecha {{ object['FECHA'] }}. Se pudo controlar en {{ object['TIME_CTRL'] }} minutos y extinguir en {{ object['TIME_EXT'] }} minutos. La causa del incendio fue {{ object['CAUSA'].decode('UTF-8') }}. En la extinción del incendio participaron {{ object['PERSONAL'] }} personas, {{ object['PESADOS'] }} vehiculos pesados y {{ object['AEREOS'] }} medios aereos.
pura mierda
ResponderEliminar