En este artículo aprenderemos a crear una aplicación RESTful API en Python utilizando el framework Flask.
¿Por qué crear una aplicación RESTful API con Python?
El framework Flask
Flask es un micro framework diseñado para crear aplicaciones web en Python de forma fácil.
Flask es un micro framework diseñado para crear aplicaciones web en Python de forma fácil.
Creando un entorno virtual
Recomendamos crear siempre un entorno virtual para nuevas aplicaciones, para que así las librerías y módulos que se instalen no interfieran con otras versiones ya existentes en nuestro sistema operativo.
Aquí puedes encontrar un link para la documentación oficial del lenguaje Python, donde conocerás más detalles sobre los entornos virtuales en Python.
En el ejemplo siguiente creamos el directorio venv donde guardaremos los archivos de nuestro entorno virtual. Es bastante común llamarlo venv, que viene del inglés virtual environment.
python3 -m venv venv
No olvide activar de nuevo el ambiente virtual con el comando:
source venv/bin/activate
Si todo funciona bien, deberías ver el prefijo (venv) antes de tu nombre de usuario en el prompt de comandos.
Estructura de directorios
A diferencia de otros frameworks, con Flask eres libre de organizar el código fuente de la manera que mejor se adapte a tus necesidades.
En este artículo dividiremos nuestra aplicación en 3 partes principales: rutas, recursos y una tercera parte de componentes comunes a la aplicación.
api
|-- __init__.py
|-- app.py
|-- common
| |-- __init__.py
| |-- util.py
|-- resources
|-- __init__.py
|-- user.py
Así podemos crear la estructura de directorios:
mkdir -p api/{resources,common}
Instalando la estructura Flask-RESTful
pip install Flask-RESTful
from flask import Flask
from flask_restful import Resource, Api
app = Flask(__name__)
api = Api(app)
class HelloWorld(Resource):
def get(self):
return {'hello': 'world'}
api.add_resource(HelloWorld, '/')
if __name__ == '__main__':
app.run(debug=True)
A continuación ejecutaremos el siguiente comando, dentro del directorio api, para iniciar nuestra aplicación:
flask --app main run
Si todo funciona según lo esperado, deberíamos ver algo parecido a:
(venv) fabio@mackbook api % python app.py
* Serving Flask app 'app'
* Debug mode: on
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on http://127.0.0.1:5000
Press CTRL+C to quit
* Restarting with stat
* Debugger is active!
* Debugger PIN: 114-087-278
Y si abrimos una nueva pestaña en nuestro navegador apuntando a http://127.0.0.1:5000
Ejemplo completo
from flask import Flask
from flask_restful import Api
from resources.user import User, UserList
app = Flask(__name__)
api = Api(app)
api.add_resource(UserList, '/users')
api.add_resource(User, '/users/')
if __name__ == '__main__':
app.run(debug=True)
Archivo api/resources/user.py
from flask_restful import abort, request, Resource
USERS = {
'usuario1': {'nome': 'Joao'},
'usuario2': {'nome': 'Maria'},
}
def abort_if_user_doesnt_exist(user_id):
if user_id not in USERS:
abort(404, message="Usuário {} não existe.".format(user_id))
class User(Resource):
def get(self, user_id):
abort_if_user_doesnt_exist(user_id)
return USERS[user_id]
def delete(self, user_id):
abort_if_user_doesnt_exist(user_id)
del USERS[user_id]
return '', 204
def put(self, user_id):
json_data = request.get_json()
USERS[user_id] = json_data
return json_data, 201
class UserList(Resource):
def get(self):
return USERS
def post(self):
json_data = request.get_json()
user_id = int(max(USERS.keys()).lstrip('usuario')) + 1
user_id = 'usuario%i' % user_id
USERS[user_id] = json_data
return USERS[user_id], 201
A continuación ejecutaremos nuestra aplicación de nuevo para probar todas las acciones compatibles:
python api/app.py
curl localhost:5000/users
{
"usuario1": {
"nome": "Joao"
},
"usuario2": {
"nome": "Maria"
}
}
curl localhost:5000/users/usuario2
{
"nome": "Maria"
}
curl -H 'Content-Type: application/json' -X POST -d '{"nome": "Pedro"}' localhost:5000/users
{
"nome": "Pedro"
}
curl -H 'Content-Type: application/json' -X PUT -d '{"nome": "Ana"}' localhost:5000/users/usuario2
{
"nome": "Ana"
}
curl -H 'Content-Type: application/json' -X DELETE localhost:5000/users/usuario1
curl localhost:5000/users
{
"usuario2": {
"nome": "Ana"
},
"usuario3": {
"nome": "Pedro"
}
}
Resumen
- Banco de datos: Flask-SQLAlchemy y SQLAlchemy
- Soporte a la autenticación basada en sesiones: Flask-Session
- Soporte a la autenticación basada en tokens JWT: Flask-JWT-Extended
- Soporte al envio de emails: Flask-Mail
- Soporte a CORS: Flask-CORS
- Interfaz de administración sobre un modelo de datos existente: Flask-Admin