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
Si aparece el error: bash: flask: command not found por favor consulte este documento.

En este punto si no hemos tenido errores, deberíamos estar ejecutando un WSGI en nuestro equipo local en el puerto 5000:

http://localhost:5000/

Primera ejecución Flask con Python

Así luce la ejecución de la primera aplicación de ejemplo en Flask con python.