Comment développer une extension Flask et rendre son projet web Python plus fun
Hello! Si vous utilisez le framework Flask pour vos projets web en Python, cet article pourrait trĂšs bien vous ĂȘtre utile. En effet, je vous explique comment dĂ©velopper une extension Flask.
Tout dâabord, câest quoi une extension?
Tous les frameworks connaissent des extensions ou plugins. Il sâagit en effet de packages ou librairies qui viennent se greffer Ă votre application pour en ajouter des fonctionnalitĂ©s qui nây existent pas par dĂ©faut. Lâun des exemples que je pourrais vous proposer est le cas des extensions Chrome. Nous les utilisons tous sur nos navigateurs. Chacun dâentre nous a peut-ĂȘtre dĂ©jĂ installĂ© une extension qui permet de faire des captures dâĂ©cran Ă partir de son navigateur. Vous noterez aussi que les frameworks populaires comme Laravel et Django possĂšdent aussi leurs magasins dâextensions. Vous pouvez utiliser GeoDjango pour ajouter un systĂšme de cartographie Ă votre application, Laravel Notify pour afficher des notifications dans votre application.
Du coup, Flask nâest pas en reste
Flask est un microframework câest-Ă -dire quâil vient avec le strict minimum dont votre application web aura besoin. Il sâagit entre autres dâun systĂšme de routage et dâun systĂšme de gestion de template. Un tel framework ne vient pas par dĂ©faut avec un systĂšme dâauthentification ou un systĂšme de gestion dâutilisateurs.
Armin Ronacher, lorsquâil a dĂ©veloppĂ© ce framework en 2010, sâĂ©tait fixĂ© lâobjectif de mettre sur pied un framework simple qui ne tiendrait que sur un seul fichier. Le dĂ©veloppeur serait alors libre dâen faire ce quâil veut et dây ajouter ce quâil veut, sans aucune contrainte Ă travers des extensions.
Aujourdâhui, Flask, tout comme les autres frameworks, a un large Ă©ventail dâextensions parmi lesquelles:
- Flask-SQLAlchemy pour connecter lâORM SQLAlchemy et les BD SQL Ă votre application.
- Flask-Login pour la gestion des authentifications.
- Flask-Admin pour faciliter le développement des interfaces administrateurs.
- Flask-Mail pour lâenvoi des mails via SMTP.
- Flask-WTF pour la gestion des formulaires et le chargement des fichiers.
En utilisant les extensions, vous multipliez votre productivitĂ© par 10 et contrĂŽlez les Ă©lĂ©ments qui constituent votre application. Elle nâest pas belle la vie ?
Vous pouvez vous aussi crĂ©er vos propres extensions et Ă©viter de recrĂ©er la roue dâun projet Ă lâautre. Imaginez un peu : vous travaillez sur un projet e-commerce avec Flask. Vous dĂ©veloppez une extension pour le paiement par mobile money, puis une autre pour la page produit, une autre pour le blog. Lorsque vous gagnez un second client, tout ce que vous aurez Ă faire sera de rĂ©utiliser ces extensions et dây ajouter quelques fonctionnalitĂ©s Ă cette derniĂšre en fonction des besoins de ce client. Vous pourrez aussi faciliter leur maintenance dans le temps et gagnez hautement en termes de productivitĂ©. Vous aurez ainsi mis sur pied un systĂšme modulaire qui pourra sâadapter Ă diffĂ©rents types dâarchitectures.
Comment développer une extension Flask ?
1. Comment se présente une extension Flask ?
Je vous prĂ©sente dâabord cette capture :
Cette capture est lâillustration parfaite de lâarchitecture dâune extension Flask. Elle est constituĂ©e de 2 fichiers principaux :
- setup.py : il sâagit du fichier de configuration qui est utilisĂ© pour installer votre extension.
- __init__.py : le fichier dâinitialisation de lâextension qui peut aussi contenir toute sa logique.
Les autres fichiers et dossiers sont juste là pour vous permettre de respecter quelques standards de développement, par exemple le modÚle MVC.
2. Ce que vous devez absolument savoir lorsque vous mettez en place votre extension
- Lâextension Flask est toujours mise dans un dossier appelĂ© Flask-NomExtension ou NomExtension-Flask.
- Ce dossier doit contenir votre extension proprement dite qui sera nommée flask_nom_extension.
- Votre extension doit ĂȘtre publiĂ©e sous une licence permissive (BSD ou MIT).
3. Un peu de pratique : développons Flask-Simple ensemble !
Il sâagit dâune simple extension qui affiche une petite phrase, un truc assez simple pour vous permettre de comprendre ce que jâexplique.
Dâabord notre setup.py
from setuptools import setup
setup(
name='Flask-Simple',
version='1.0',
url='https://github.com/abdounasser202/Flask-Simple',
license='BSD',
author='Nasser',
author_email='nasser@example.com',
description='A simple Flask extension',
py_modules=['flask_simple'],
zip_safe=False,
include_package_data=True,
platforms='any',
install_requires=[
'Flask'
],
classifiers=[
'Environment :: Web Environment',
'Framework :: Flask',
'Intended Audience :: Developers',
'License :: OSI Approved :: BSD License',
'Operating System :: OS Independent',
'Programming Language :: Python',
'Topic :: Internet :: WWW/HTTP :: Dynamic Content',
'Topic :: Software Development :: Libraries :: Python Modules'
]
)
Dans ce fichier, on dĂ©finit le nom de lâapplication, sa version, ses dĂ©pendances, etc.
Ensuite notre init.py
Il sâagit du contenu de notre extension proprement dite. On peut lâorganiser de telle sorte quâon puisse appeler des objets Ă partir des modĂšles (dossier models) et afficher les vues Ă partir du dossier views.
from flask import Blueprint
class Simple:
def __init__(self, app=None):
if app is not None:
self.init_app(app)
def init_app(self, app):
self.register(app)
def register(self, app):
simple_page = Blueprint('simple_page', __name__,
template_folder='templates')
@simple_page.route('/hello/<name>')
def hello(name):
return f"Hello {name}"
app.register_blueprint(simple_page)
- Tout dâabord, je commence par importer la classe Blueprint :
from flask import Blueprint
. La classe Blueprint de Flask est un objet qui permet dâavoir des applications modulaires. En effet, chaque Blueprint a ses propres modĂšles, ses propres vues et ses propres routes. - Ensuite, je dĂ©finis la classe Simple qui contiendra la logique de mon extension.
- Dans la mĂ©thode __init__(), jâinstancie mon extension Ă travers la mĂ©thode init_app(). init_app() va permettre dâenregistrer mon Blueprint Ă travers la mĂ©thode register().
- Dans la mĂ©thode register(), jâinitialise mon Blueprint et utilise la fonction add_url_rule() qui prend en paramĂštre la route et la fonction qui sera exĂ©cutĂ©e lorsque cette route est appelĂ©e.
On peut maintenant obtenir une extension Flask qui affiche Hello <name>
lorsque jâaccĂšde Ă la route /hello/<name>
. Par exemple, /hello/nasser
affichera Hello nasser
.
Vous pouvez accĂ©der au code entier de cette petite extension sur GitHub Ă lâadresse https://github.com/abdounasser202/Flask-Simple.
Je vous propose également de lire la documentation officielle sur le développement des extensions ici : https://flask.palletsprojects.com/en/1.1.x/extensiondev/.
Conclusion
Ăa fait plusieurs annĂ©es que je dĂ©veloppe souvent avec Flask et lorsque jâai dĂ©couvert Odoo, jâai Ă©tĂ© Ă©bloui par sa modularitĂ© parce que sur Odoo, il y a un module pour tout, on peut hĂ©riter et modifier tout ce quâon veut. Alors je me suis dit : pourquoi ne pas utiliser la mĂȘme logique sur Flask en exploitant la puissance des Blueprints ? Câest alors que jâai commencĂ© Ă me documenter dans le but de comprendre comment cela fonctionne et je vous assure que cet article de Bruno Rocha mâa Ă©tĂ© dâune grande aide. Câest alors que jâai dĂ©cidĂ© de partager avec vous le peu que jâai appris.
Si vous avez des remarques et suggestions, les commentaires sont ouverts !