Article
· Mars 7 8m de lecture

Exemple d'application Flask avec SQLAlchemy-IRIS - Partie 2

Pourquoi connecter Flask à InterSystems IRIS ?

    La première chose qui nous vient à l'esprit lorsque nous envisageons de coupler Flask avec IRIS est un portail permettant d'interagir avec vos clients et partenaires. Un site web où les patients peuvent accéder à leurs examens cliniques en est un bon exemple. Bien entendu, ce cas nécessiterait une toute nouvelle couche de sécurité, que nous n'avons pas abordée dans notre dernier article. Cependant, nous pouvons l'ajouter sans effort avec Werkzeug, par exemple.
Les sites Web qui établissent un lien entre vos produits et vos clients sont, en effet, un excellent exemple de ce que vous pouvez réaliser en connectant ces technologies car Flask est flexible et vous pouvez facilement ajouter et modifier n'importe quelle fonctionnalité avec cette application ou même faire plus de choses si vous avez une certaine expérience avec CI/CD.
Examinons quelques-unes des astuces que vous pouvez réaliser. Si vous vous souvenez de la première application présentée initialement, vous vous rappellerez que Flask n'a pas besoin d'une structure complexe pour fonctionner, ce qui signifie que vous pouvez le construire à partir de zéro en quelques minutes de codage seulement. Ainsi, vous pouvez rapidement créer de multiples interfaces conviviales et des portails interactifs pour afficher et analyser les données. Par exemple, vous pouvez suivre séparément chaque élément d'une production. Vous pouvez également fournir toutes les fonctionnalités d'InterSystems IRIS que vous utilisez fréquemment sur une magnifique plate-forme sans code. 
    Je travaillais pour Innovatium depuis l'année dernière, et cette expérience m'a permis de rencontrer de nombreuses situations où il était utile de prendre en compte la mémoire utilisée dans les ensembles de résultats de requêtes, les requêtes et les tables, de temps en temps. Ce problème est facile à résoudre en créant un portail similaire à celui créé dans mon article précédent sur Django. Comme le développement avec Flask est plus rapide qu'avec Django, il serait facile de construire quelques plateformes différentes pour chaque projet et pour chaque table que nous souhaitons suivre. En outre, si vous avez un peu de temps libre, vous pouvez automatiser votre plateforme pour obtenir des mises à jour en direct avec Flask-SocktetIO.
Avoir un modèle pour démarrer vos projets peut considérablement accélérer le développement. Pour cette raison, nous allons présenter dans la section suivante un modèle de CRUD de Flask-IRIS publié sur OpenExchange (celui que nous avons construit dans la première partie de cette série d'articles). Autrement dit, si vous n'avez pas le temps d'étudier tous les détails abordés dans le dernier article, il vous suffit de télécharger l'application et de continuer à travailler en toute tranquillité sur votre projet, en vous appuyant sur les connaissances que vous avez déjà acquises.
 

L'application OpenExchange

J'ai décidé d'écrire cette série d'articles en m'inspirant de l'idée mentionnée dans l'article sur l'exemple d'application Flask avec SQLAlchemy Example of Flask application with SQLAlchemy IRIS. Cependant, puisque vous êtes déjà peut-être familier avec les frameworks web de Python et la logique de CRUD, je vais vous présenter une application qui vous permettra de prendre le taureau par les cornes. Ainsi, vous ne perdrez pas votre temps à lire avant la concrétisation de votre projet.
    Suivez les étapes ci-dessous pour télécharger et lancer l'application, commencez à l'utiliser et constatez à quel point elle est facile à mettre en œuvre. Il existe une version plus succincte du tutoriel très proche sur son utilisation sur le fichier README du référentiel GitHub associé. Vous pouvez également consulter tous les liens relatifs à l'application sur sa page Open Exchange.

 

Guide d'installation

    Avant de développer des projets avec Python, il est toujours préférable de configurer un environnement virtuel. Cela vous aidera à ajouter toutes les exigences, configurations et variables spécifiques à ce projet, sans affecter votre ordinateur et d'autres projets.
    Si vous utilisez Windows/Linux/macOS, ouvrez le terminal dans le répertoire où vous souhaitez démarrer votre projet et créez un environnement virtuel à l'aide de la commande suivante:
python -m venv .venv-folder
    La commande susmentionnée peut être décomposée comme suit : "python" définira un environnement Python pour les commandes suivantes, le drapeau -m lancera un module (dans ce cas, venv), et .venv-folder créera un dossier appelé venv-folder dans le répertoire courant (référencé par le point), où le module venv s'exécutera.
    La prochaine étape consistera à activer l'environnement créé avant de télécharger les prérequis et de lancer votre projet dans les règles de l'art.
    Si vous utilisez macOS ou Linux, vous devez taper “. .venv/bin/activate”. Pour Windows, la commande similaire “.venv\Scritps\activate” lancera le fichier approprié pour la tâche.
    Ensuite, vous pouvez cloner le référentiel avec la commande git clone.
git clone https://github.com/heloisatambara/flask-iris.git
    Enfin, installez la configuration requise à l'aide du paquet d'installation "Python Install Package", et vous serez prêt à commencer le codage.
pip install -r requirements.txt
    Comme vous pouvez le vérifier dans le fichier référencé, la commande ci-dessus installera au moins la version 2.3.3 de Flask, au moins la version 3.1.1 de Flask-SQLAlchemy, et au moins la version 0.10.5 de sqlalchemy-iris, par ^CaretDev.

 

Guide d'utilisation

    Tout d'abord, il faut connecter l'application à la base de données et à l'espace de noms souhaités. Comme vous avez sans doute appris dans l'article précédent, cette connexion se fait sur le fichier flaskr-iris/database.py, au format “iris://username:password@host:port/NAMESPACE”, selon les spécifications de la documentation SQLALchemy documentation pour la fonction create_engine(). Examinez l'exemple ci-dessous.
    engine = create_engine("iris://_SYSTEM:sys@localhost:1972/SAMPLE")
    Vous pouvez maintenant exécuter l'application web et constater que l'exemple développé fonctionne, après avoir vérifié que l'instance est en cours d'exécution, à l'aide de la commande mentionnée.
...\flask-iris> flask --app flaskr-iris run --debug
    Pour adapter l'application à vos besoins, commencez par modifier le fichier flaskr-iris/models.py pour refléter les données à transférer d'IRIS à Python. L'exemple cloné sur GitHub couvre déjà un grand nombre de cas, comme vous pouvez le vérifier dans l'article précédent, dans la section dédiée aux modèles. Si vous avez besoin d'autre chose, vous pouvez consulter la documentation Flask-SQLAlchemy ou SQLAlchemy oncernant respectivement la définition de modèles et les tables déclaratives.
    Ensuite, il est recommandé de poursuivre le développement en modifiant les fichiers dans flaskr-iris/templates, afin d'adapter l'affichage à vos données. La documentation de Jinja documentation contient toutes les options pour coder vos modèles.
    Ensuite, vous pouvez utiliser les exemples de auth.py et blog.py pour créer vos vues. N'oubliez pas d'enregistrer tous les nouveaux Blueprints dans la fabrique create_app(), dans le fichier __init__.py.
    Enfin, avec les fichiers à l'intérieur du dossier static, vous devriez gagner une longueur d'avance pour ajouter une touche de votre marque à la page web.
 

Section supplémentaire - Les erreurs que j'ai rencontrées et la façon de les corriger

  • Commençons par ce qui peut sembler être une erreur de débutant mais qui peut arriver à tout le monde : si vous avez oublié d'initialiser l'instance IRIS à laquelle vous vous connectez, vous risquez de recevoir le message suivant :
sqlalchemy.exc.OperationalError: (intersystems_iris.dbapi._DBAPI.OperationalError) [WinError 10061] No connection could be made because the target machine actively refused it.


Bien sûr, tout ce que vous avez à faire ici est d'appuyer sur " Start InterSystems IRIS " (démarrage d'InterSystems IRIS) et d'exécuter à nouveau votre application Flask.
 

  • L'erreur suivante peut sembler un peu plus difficile à résoudre :
RuntimeError: Working outside of request context.

This typically means that you attempted to use functionality that
needed an active HTTP request. Consult the documentation on testing
for information about how to avoid this problem.
db.init_app(app)

    Plusieurs raisons peuvent provoquer ce type d'erreur. Si vous l'avez trouvé lors d'un test, utilisez test_client pour simuler une requête complète. Sinon, il vous faudra peut-être déplacer votre code dans une vue. Cependant, j'ai rencontré cette erreur dans une situation peu courante : Je n'avais pas initié la base de données avec l'application Flask. Pour y remédier, lorsque vous définissez votre base de données avec db = SQLAlchemy() ou quelque chose de similaire, vous pouvez vous connecter directement à l'application en faisant ce qui suit :

app = Flask(__name__)
db = SQLAlchemy(app)

Par ailleurs, si vous travaillez avec une fabrique d'applications, comme indiqué dans l'article précédent, vous pouvez connecter l'application plus tard en appelant init_app() :

db = SQLAlchemy()

def create_app():
    app = Flask(__name__)
    db.init_app(app)
  • Si vous choisissez de suivre l'approche décrite dans la première partie de cet article, vous remarquerez peut-être qu'à chaque fois que vous exécutez votre application, celle-ci essayera de créer toutes les bases de données à partir des modèles que vous avez définis. Cela signifie que vous devrez peut-être traiter ce type d'erreur avec un bloc "try/except". Il est également possible d'ignorer l'erreur si la table existe déjà, mais il faut aussi régler d'autres problèmes. Toutefois, si vous choisissez cette solution, vous devrez peut-être supprimer toutes les tables manuellement chaque fois que vous y apporterez des modifications.  Une autre option consiste à utiliser l'attribut "checkfirst" lors de l'appel de la fonction create_all(). Cela permet d'ignorer les tables qui existent déjà, de sorte que les changements ne seront pas appliqués. Si cela correspond à vos besoins, profitez-en. Pour une mise en œuvre à plus grande échelle, vous pouvez utiliser SQLAlchemy afin de supprimer les tables précédemment créées avant d'exécuter create_all(). Attention : les tables seront créées automatiquement sous le format de nom DefaultSchema_snake_case_model_name. Pour illustrer cette idée, dans l'exemple que nous venons d'explorer les tables ont été construites dans IRIS sous les noms de SQLUser_user et SQLUser_post.
try:
with app.app_context():
db.create_all()
except DatabaseError as err:
if 'already exists' in err._sql_message():
print("Databases already exist.")
else:
print(err) 
  • Enfin, si vous placez les modèles dans un autre fichier par rapport à celui que vous avez utilisé pour exécuter la fonction create_all(), vous pouvez avoir l'impression que cette fonction échoue. Cela se produit parce les modèles que vous voulez assembler doivent être importés avant d'essayer de les fabriquer.
from .models import User, Post
db.init_app(app)
try:
with app.app_context():
db.create_all()
Discussion (0)2
Connectez-vous ou inscrivez-vous pour continuer