Construire une API web en Python avec Flask

flask-alt flaskie

Cette procédure va porter sur la création d’une API en Python basée sur Flask.

Le but de cette procédure est de mettre en place un site Web très basique sur lequel on pourra, suivant l’URL demandée (routes), afficher diverses informations contenues dans une base de données au format SQLite.

 

C’est quoi ?

Flask est un framework Python orienté vers le développement Web. Il a pour avantages d’être facile à utiliser et d’être très léger. Grâce à ce petit tuto, vous aurez une base pour commencer à travailler avec Python et SQLite afin de coordonner une base de données et un site Web.

 

C’est parti !

Pour commencer, il nous faut quelques dépendances :

apt-get install -y python3 python3-pip sqlite3

Vous pouvez si vous le souhaitez installer PyCharm, un IDE bien sympa pour Python. Il existe également une version professionnelle mais la version ‘community’ est bien suffisante pour le commun des mortels.

Il suffit de le télécharger à cette adresse et de lancer les commandes suivantes :

cd /opt #ou un dossier de votre choix
wget https://download.jetbrains.com/python/pycharm-community-2018.1.2.tar.gz
tar xf pycharm-community-2018.1.2.tar.gz
rm -rf pycharm-community-2018.1.2.tar.gz
mv pycharm-community-2018.1.2 pycharm
ln -s /opt/pycharm/bin/pycharm.sh /usr/bin/pycharm

Une fois lancé et votre nouveau projet créé, ne lancez pas d’installation de modules (pip install) depuis un terminal normal. Lancez un terminal depuis PyCharm car celui-ci sera préconfiguré avec virtualenv, permettant ainsi de cloisonner chaque projet et leur dépendance, limitant ainsi les soucis.

Pour utiliser virtualenv en dehors de PyCharm, faites comme suit :

cd /root
apt-get install virtualenv
virtualenv venv
source venv/bin/activate

 

Les dépendances

Depuis le terminal de PyCharm ou de votre terminal virtualenv:

pip install flask flask-jsonpify flask-sqlalchemy flask-restful
pip freeze

En plus de ça, il va nous falloir un exemple de base de données SQLite au format .db. Vous pourrez trouvez ceci à cette adresse :

http://www.sqlitetutorial.net/wp-content/uploads/2018/03/chinook.zip

Une fois récupéré et dézippé, créez un dossier dédié à cette BDD. J’ai utilisé le dossier suivant /opt/sqlite3-databases à titre d’exemple mais si vous choisissez le votre, veillez à corriger la 7ème ligne du script. Vérifiez aussi les droits si vous avez des erreurs.

db_connect = create_engine('sqlite:////opt/sqlite3-databases/chinook.db')

 

Le code

Une fois fait, créez un nouveau fichier server.py et ajoutez-y ce code :

from flask import Flask, request
from flask_restful import Resource, Api
from sqlalchemy import create_engine
from json import dumps
from flask import jsonify

db_connect = create_engine('sqlite:////opt/sqlite3-databases/chinook.db')
app = Flask(__name__)
api = Api(app)


class Employees(Resource):
 def get(self):
 conn = db_connect.connect() # connect to database
 query = conn.execute("select * from employees") # This line performs query and returns json result
 return {'employees': [i[0] for i in query.cursor.fetchall()]} # Fetches first column that is Employee ID


class Tracks(Resource):
 def get(self):
 conn = db_connect.connect()
 query = conn.execute("select trackid, name, composer, unitprice from tracks;")
 result = {'data': [dict(zip(tuple(query.keys()), i)) for i in query.cursor]}
 return jsonify(result)


class Employees_Name(Resource):
 def get(self, employee_id):
 conn = db_connect.connect()
 query = conn.execute("select * from employees where EmployeeId =%d " % int(employee_id))
 result = {'data': [dict(zip(tuple(query.keys()), i)) for i in query.cursor]}
 return jsonify(result)


api.add_resource(Employees, '/employees') # Route_1
api.add_resource(Tracks, '/tracks') # Route_2
api.add_resource(Employees_Name, '/employees/<employee_id>') # Route_3

if __name__ == '__main__':
 app.run(port='5002')

Vous pouvez maintenant lancer le script server.py et visiter les URL suivantes :

Pour afficher les ID des employés :

http://127.0.0.1:5002/employees

Pour afficher toutes les infos des employés pêle-mele :

http://127.0.0.1:5002/tracks

Pour afficher les informations d’un employé en particulier selon son ID (changer le nom en fin d’URL en correspondance avec un ID récupéré avec la première requête):

http://127.0.0.1:5002/employees/2

Vous trouvez le code correspondant sur ce gist ^^