Creando los directorios iniciales y prerequisitos
Primero creo un directorio (APIS) donde ordenadamente trabajaré los proyectos de API REST:
mortiz@florida:~/Documents/projects/python/APIS/
Y dentro del directorio APIS el nuevo proyecto a desarrollar, que al ser el primero llamaré «new_project»:
mortiz@florida:~/Documents/projects/python/APIS/new_project$
Vamos a utilizar la última versión de Python3 para salir de la zona de comfort de Python 2.x. Con lo cual instalamos la herramienta de ambientes virtuales de python:
sudo apt-get install python3-venv
Crear el ambiente virtual
Cuando creamos proyectos con python normalmente vamos a necesitar librerías. Si tenemos muchos proyectos seguramente usemos versiones de librerías diferentes o incluso versiones de python diferentes, los ambientes virtuales nos permiten separar cada proyecto y sus librerías al igual que las propias instaladas a nivel de sistema operativo.
Creamos un ambiente virtual:
mortiz@florida:~/Documents/projects/python/APIS/new_project$ python3 -m venv venv
Y lo activamos:
mortiz@florida:~/Documents/projects/python/APIS/new_project$ . venv/bin/activate
Eso cambiará el prompt de la linea de comandos añadiendo (venv) al inicio y nos indicará que estamos dentro de ese ambiente virtual:
(venv) mortiz@florida:~/Documents/projects/python/APIS/new_project$
Como verán una estructura de directorios está creada específicamente para este nuevo proyecto:(venv)
(venv) mortiz@florida:~/Documents/projects/python/APIS/new_project$ ls -ltr venv/ total 16 lrwxrwxrwx 1 mortiz mortiz 3 Oct 4 11:09 lib64 -> lib drwxr-xr-x 3 mortiz mortiz 4096 Oct 4 11:09 lib drwxr-xr-x 2 mortiz mortiz 4096 Oct 4 11:09 include -rw-r--r-- 1 mortiz mortiz 117 Oct 4 11:10 pyvenv.cfg drwxr-xr-x 2 mortiz mortiz 4096 Oct 4 11:10 bin
Instalando Flask
Dentro de nuestro ambiente virtual instalamos Flask, un framework basado en Jinja (un sistema de templates que renderiza las páginas web) y Werkzeug (Implementa Web Server Gateway Interface, viene a ser como la capa que une la aplicación web desde el frontend al backend) estas son las más importantes aunque trae otras que podrán consultar aquí.
(venv) mortiz@florida:~/Documents/projects/python/APIS/new_project$ pip install Flask Collecting Flask Cache entry deserialization failed, entry ignored Cache entry deserialization failed, entry ignored Downloading https://files.pythonhosted.org/packages/7f/e7/08578774ed4536d3242b14dacb4696386634607af824ea997202cd0edb4b/Flask-1.0.2-py2.py3-none-any.whl (91kB) # etc......
Mi primer aplicación en Flask
Primero nos situamos en el directorio del proyecto «new_project» y creamos el archivo de ejemplo «test_server.py» con lo siguiente dentro:
from flask import Flask, request app = Flask(__name__) @app.route('/', methods=['GET', 'POST']) def login(): if request.method == 'POST': return 'POST Method local server' else: return 'GET Method local server'
En el ejemplo anterior publicamos en el root (/) de localhost:5000 usando el decorador «route()», pueden leer más sobre decoradores aquí. Si hacemos un GET o POST recibiremos mensajes diferentes.
Para probar el GET solo falta entrar a localhost:5000, para probar el POST podemos usar curl de esta forma:
mortiz@florida:~/Documents/projects$ curl --noproxy "*" -X POST http://localhost:5000/login POST Method local server
Ahora revisamos qué versión de Flask instalamos, ejecutamos python3 y consultamos el atributo __version___
(venv) mortiz@florida:~/Documents/projects/python/APIS/new_project$ python3 Python 3.5.3 (default, Sep 27 2018, 17:25:39) [GCC 6.3.0 20170516] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import flask >>> flask.__version__ '1.0.2' >>>
O también podemos usar el comando pip freeze y filtrar por «Flask»:
(venv) mortiz@florida:~/Documents/projects/python/APIS/new_project$ pip freeze |grep Flask Flask==1.0.2 Flask-CLI==0.4.0
Luego podremos exportamos la variable para Flask con el nombre de nuestro archivo:
(venv) mortiz@florida:~/Documents/projects/python/APIS/new_project$ export FLASK_APP=test_server.py
Y ejecutamos flask run:
(venv) mortiz@florida:~/Documents/projects/python/APIS/new_project$ flask run * Serving Flask app "test_server.py" * Environment: production WARNING: Do not use the development server in a production environment. Use a production WSGI server instead. * Debug mode: off * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
Otra alternativa para iniciarlo es:
$ export FLASK_APP=test_server.py $ python -m flask run
En este punto si no hemos tenido errores, deberíamos estar ejecutando un WSGI en nuestro equipo local en el puerto 5000: