Dans le domaine de l’hébergement de haute performance et des outils de développement polyvalents, Kinsta se distingue comme une plateforme de premier plan pour WordPress, les applications, les bases de données et même l’hébergement gratuit de sites statiques.

Slack, réputé pour ses commandes Slash, s’intègre parfaitement aux applications et services hébergés par Kinsta, ce qui permet aux utilisateurs d’automatiser des tâches et d’améliorer considérablement leur efficacité.

Ce guide explique comment établir une communication en temps réel entre Slack et une application Python hébergée sur Kinsta. En exploitant mes commandes Slash, les utilisateurs de l’application ont la possibilité de créer, interroger et supprimer rapidement des produits.

Cette intégration leur permet de mettre à jour dynamiquement leur inventaire de produits, garantissant ainsi des réponses rapides aux besoins des clients.

Comprendre les commandes Slack

Les commandes Slack sont des raccourcis textuels. Elles commencent par une barre oblique (/) suivie d’un mot-clé spécifique et d’un paramètre facultatif.

Les commandes Slash déclenchent des actions ou interagissent directement avec des intégrations dans l’interface Slack. Par exemple, /remind permet de définir des rappels directement par le biais des notifications Slack.

Grâce aux intégrations Slack, vous pouvez configurer des commandes personnalisées pour vos applications. Dans ce tutoriel, votre équipe peut interroger sans effort l’inventaire de notre application produit à l’aide de la commande Slash /check_inventory et d’autres commandes.

L’intégration de Slack à vos applications favorise une interaction transparente et des flux de travail rationalisés dans un environnement de travail moderne. Elle améliore la communication et la productivité via :

  • Un centre de communication centralisé – Slack sert d’espace unifié pour les équipes. L’intégration d’applications dans Slack permet de consolider les canaux, de conserver les conversations et les informations en un seul endroit et de renforcer l’efficacité.
  • Mises à jour en temps réel – Les applications intégrées fournissent des alertes instantanées sur les évènements clés, ce qui permet à chacun de rester informé et de réagir rapidement aux changements ou aux mises à jour.
  • Rationalisation des flux de travail – Les intégrations automatisent les tâches telles que les notifications des outils de gestion de projet ou le déclenchement d’actions dans les logiciels de gestion de la relation client, réduisant ainsi le travail manuel.
  • Collaboration améliorée – Les membres de l’équipe qui accèdent aux applications directement depuis Slack favorisent une collaboration transparente. Ils peuvent facilement partager, modifier des fichiers et discuter de projets, ce qui favorise le travail d’équipe entre les différentes fonctions.

Comment créer une application Python sur Kinsta

Construisons et déployons une application de gestion de produits sur Kinsta. Ensuite, intégrez-la à Slack pour explorer les commandes Slash. Les utilisateurs peuvent ajouter, supprimer et interroger les produits de l’inventaire via les commandes Slash dans Slack.

Pré-requis

Pour suivre ce guide, nous supposons que vous avez :

Tout d’abord, configurons un projet Python sur Kinsta. Pour cema, suivez les étapes ci-dessous :

  1. Visitez le modèle Python de Kinsta sur GitHub.
  2. Sélectionnez Utiliser ce modèle > Créer un nouveau dépôt pour copier le code de démarrage dans un dépôt au sein de votre compte GitHub.
  3. Une fois que votre dépôt est prêt, connectez-vous ou créez un compte pour afficher votre tableau de bord MyKinsta.
  4. Autorisez Kinsta avec votre fournisseur Git (Bitbucket, GitHub ou GitLab).
  5. Cliquez sur Applications dans la colonne latérale de gauche, puis sur Ajouter une application.
  6. Sélectionnez le dépôt et la branche à partir desquels vous souhaitez déployer.
  7. Attribuez un nom unique à votre application et choisissez l’emplacement du centre de données.
  8. Configurez ensuite votre environnement de construction. Sélectionnez la configuration Machine de construction standard avec l’option Nixpacks recommandée pour cette démo.
  9. Utilisez toutes les configurations par défaut, puis cliquez sur Créer une application.

Le déploiement prend généralement quelques minutes et, en cas de succès, vous recevrez un lien vers votre application ainsi qu’un tableau de bord contenant des informations sur le déploiement.

Comment configurer l’intégration de Slack dans une application Python

Commençons par créer une application Slack, puis configurons les commandes Slash qui seront connectées à votre application Python via des jetons. Configurons une application Slack :

  1. Accédez au tableau de bord de l’API Slack.
  2. Cliquez sur Créer une nouvelle application et choisissez À partir de zéro.
  3. Nommez votre application Slack (par exemple, product-inventory).
  4. Sélectionnez l’espace de travail et cliquez sur Créer une application.

Maintenant, pour l’authentification :

  1. Activez le mode Socket dans la colonne latérale de votre tableau de bord Slack.
  2. Générez un jeton au niveau de l’application en saisissant un nom de jeton et en cliquant sur Générer.
  3. Enregistrez ce jeton au niveau de l’application pour configurer les variables environnementales ultérieurement.

Comment configurer les commandes Slash

Pour configurer les commandes Slash de votre application :

  1. Accédez à la section Fonctionnalités sous Informations de base dans le tableau de bord de l’API Slack. Choisissez Commandes Slash.

    Le tableau de bord de l'API Slack propose des options pour ajouter des caractéristiques et des fonctions.
    Le tableau de bord de l’API Slack propose des options pour ajouter des caractéristiques et des fonctions.

  2. Cliquez sur Créer une nouvelle commande pour configurer une nouvelle commande.

    Page Créer une nouvelle commande sur Slack.
    Page Créer une nouvelle commande sur Slack.

  3. Sur la page Créer une nouvelle commande, renseignez les détails de votre nouvelle commande Slack. Par exemple, tapez /hi dans le champ Commande. Si vous le souhaitez, ajoutez une brève description telle que « Says hello ! » et fournissez un indice d’utilisation. Cliquez sur Enregistrer.
  4. Dans la section Installer l’application de la colonne latérale, cliquez sur Installer dans l’espace de travail.
  5. Accédez au jeton OAuth de l’utilisateur du robot en accédant à OAuth & Permissions dans la colonne latérale. Enregistrez ce jeton pour référence ultérieure.

Comment ajouter des jetons au déploiement de l’application Kinsta

  1. Allez dans la section Variables d’environnement sous Régalges du déploiement de votre application dans MyKinsta.
  2. Cliquez sur Ajouter une variable d’environnement.

    La fenêtre contextuelle Ajouter une variable d'environnement Slack s'affiche.
    La fenêtre contextuelle Ajouter une variable d’environnement Slack s’affiche.

  3. Pour la clé 1, SLACK_BOT_TOKEN, collez le jeton OAuth de l’utilisateur du bot dans la valeur 1. Pour la clé 2, SLACK_APP_TOKEN, collez le jeton de niveau application dans la valeur 2.
  4. Assurez-vous que les deux options sont cochées et cliquez sur Déployer maintenant pour que Kinsta puisse redéployer votre application avec les variables d’environnement.

Comment implémenter la communication en temps réel

Pour cette démo, vous utilisez le modèle Python de Kinsta, qui contient les fichiers suivants :

  • Procfile – Spécifie les commandes pour exécuter votre application.
  • requirements.txt – Liste les dépendances nécessaires à l’application Python.
  • server.py – Le fichier principal de l’application Python, qui gère les fonctionnalités ou les opérations côté serveur.

Kinsta crée automatiquement un processus basé sur le Procfile dans la racine du référentiel lors du déploiement d’une application. Le Procfile contient le code suivant.

web: python server.py

Cette commande exécute le code que server.py contient. Kinsta installe également les dépendances Python dans requirements.txt lors du déploiement et du redéploiement.

Maintenant, utilisons le framework Bolt pour mettre en place une communication en temps réel avec votre application. Ajoutez les lignes suivantes à votre fichier requirements.txt pour installer automatiquement Bolt sur votre application Python lorsque vous mettez à jour le référentiel.

slack-bolt==1.18.0
slack-sdk==3.23.0

Ajoutez également la bibliothèque psycopg2 au fichier requirements.txt. Elle sera utilisée pour se connecter à une base de données Postgres.

psycopg2-binary==2.9.9

Comment implémenter une base de données Postgres avec Kinsta

L’application d’inventaire des produits a besoin d’un moyen de conserver les données sur les produits que les commandes Slash ajoutent à la base de données. Pour créer un stockage de données persistant, vous pouvez utiliser la base de données hébergée de Kinsta.

  1. Tout d’abord, déployez une base de données Postgres sur votre tableau de bord Kinsta en accédant à la section Bases de données dans la barre latérale du tableau de bord MyKinsta.
  2. Cliquez sur Créer une base de données. Configurez les détails de votre base de données en entrant un nom et en sélectionnant le type de base de données. Sélectionnez l’option PostgreSQL et configurez la taille souhaitée. Un nom d’utilisateur et un mot de passe pour la base de données sont automatiquement générés :

    Formulaire de création d'une base de données.
    Formulaire de création d’une base de données.

  3. Cliquez sur Continuer pour terminer la configuration de votre base de données. Attendez que la base de données PostgreSQL soit créée.
    Une fois la création réussie, pour obtenir votre chaîne de connexion pour l’accès externe à votre base de données, naviguez jusqu’à la section Connexions externes du tableau de bord de votre base de données déployée et copiez la chaîne de connexion externe.
    Informations sur la connexion externe de la base de données.
    Informations sur la connexion externe de la base de données.

    Vous pouvez maintenant utiliser cette chaîne de connexion pour vous connecter à la base de données depuis votre application Python.

  4. Dans votre projet Python, créez un fichier db.py dans votre répertoire de projet pour les fonctions d’initialisation de la base de données. Ajoutez le code suivant :
    import psycopg2
    import os
    
    # get connection string from environment variable
    connection_string = os.environ.get("DATABASE_CONNECTION_STRING")
     
    def get_conn():
       # create connection
       conn = psycopg2.connect(connection_string)
    
       # Return connection to the database
       return conn
         
    def init_db():
       # get connection
       conn = get_conn()
    
       # get cursor
       cur = conn.cursor()
    
       cur.execute("""
           DROP TABLE IF EXISTS products;
                       
           CREATE TABLE products (
               id INTEGER PRIMARY KEY,
               name TEXT UNIQUE NOT NULL,
               quantity INTEGER NOT NULL
           );
       """)
    
       cur.close()
       conn.commit()
       conn.close()

    Lorsque la fonction get_conn() est appelée, elle crée et renvoie une connexion à la base de données Kinsta déployée en utilisant votre chaîne de connexion externe.

    La fonction init_db() obtient une connexion à la base de données, définit le schéma de la base de données et crée la table tout en validant les modifications. Vous ne devez appeler la fonction init_db() qu’une seule fois lors de la configuration initiale du serveur d’application. Utilisez la fonction get_conn() dans les appels suivants pour obtenir une connexion à la base de données.

Comment implémenter les gestionnaires de commandes Slash

Maintenant, construisez le code du serveur d’application.

  1. Supprimez le contenu du fichier server.py et importez les bibliothèques suivantes :
    import os
    from slack_bolt import App
    from slack_bolt.adapter.socket_mode import SocketModeHandler
    from db import get_conn, init_db
    from psycopg2 import DatabaseError

    Celles-ci sont nécessaires pour les fonctionnalités de l’application Slack, les connexions à la base de données et la gestion des erreurs.

  2. Ajoutez le code suivant au fichier server.py après les déclarations d’importation :
    # Initialize your app with your bot token
    app = App(
      token=os.environ.get("SLACK_BOT_TOKEN"),
    )

    La classe App de slack_bolt est utilisée pour créer une instance de l’application Slack. Elle initialise l’application avec le jeton OAuth de l’utilisateur du robot récupéré dans la variable d’environnement SLACK_BOT_TOKEN.

  3. Ensuite, déployez un gestionnaire pour la commande Slash /hi que vous avez ajoutée à votre application Slack plus tôt. Ajoutez les lignes suivantes au fichier server.py.
    # The hi command simply sends back a greeting
    @app.command("/hi")
    def send_hello(ack, respond, command):
      # Acknowledge command request
      ack()
      respond(f"Hello!")

    Le fichier @app.command() crée un récepteur pour la chaîne de commande transmise en tant qu’argument et met en correspondance la fonction suivante avec les requêtes de cette commande Slash. La fonction send_hello() gère la logique de la requête.

    Le code transmet également les variables de requête ack, respond et command à la fonction. Appelez ack pour accuser réception de la requête de la commande Slash, car il s’agit de la première étape avant la poursuite du traitement, et appelez respond pour renvoyer une réponse textuelle.

    Lorsque l’utilisateur tape la commande Slash /hi dans votre espace de travail Slack, il obtient la réponse « Hello ! »

  4. Retournez au tableau de bord de votre application Slack et ajoutez les commandes suivantes.
    Commande Brève description Conseil d’utilisation
    /add_product Ajouter un produit à l’inventaire. product_id, product_name, product_quantity
    /check_inventory Rechercher dans l’inventaire un produit dont l’ID correspond. product_id
    /delete_product Supprimer de l’inventaire le produit dont l’ID correspond. product_id

    Votre page de commandes Slash devrait ressembler à la capture d’écran suivante, qui contient une liste de commandes et leurs détails.

    Page d'API de commandes Slack.
    Page d’API de commandes Slack.

  5. Ajoutez le gestionnaire /add_product au fichier server.py.
    # command to add products
    @app.command("/add_product")
    def add_product(ack, respond, command, request):
     #Acknowledge command request
     ack()
    
     # Extract payload from request
     payload = request.body['text']
     id, name, quantity = [i.strip() for i in payload.split(",")]
      
     # conn object
     conn = None
    
     try:
       # get conn
       conn = get_conn()
    
       # get cursor
       cur = conn.cursor()
    
       # Insert product into the database
       cur.execute(
         "INSERT INTO products (id, name, quantity) VALUES (%s, %s, %s)",
           (int(id), name, int(quantity))
       )
       
       # close communication with postgresql
       cur.close()
       
       # commit changes
       conn.commit()
       
       # Response
       respond(f"""Added product to inventory:
         id - {id},
         name - {name},
         quantity - {quantity}
       """)
    
     except DatabaseError:
       # Send a response
       respond(f"Product with ID {id} exists in inventory!")
      
     finally:
       # close connection
       if conn is not None:
         conn.close()

    request.body accède à la charge utile complète de la requête que Slack envoie pendant le processus de traitement.

    Lorsqu’un utilisateur tape la commande /add_product Slash, l’application envoie l’exemple suivant de charge utile JSON sous la forme d’une requête POST.

    {
        'token': , 
        'team_id': , 
        'team_domain': , 
        'channel_id': , 
        'channel_name': , 
        'user_id': , 
        'user_name': , 
        'command': '/add_product', 
        'text': '1, notebook, 5', 
        'api_app_id': , 
        'is_enterprise_install': , 
        'response_url': , 
        'trigger_id': 
    }

    Les champs command et text sont inclus. command contient la commande Slash déclenchée tandis que text contient son texte additionnel. Par exemple, si l’utilisateur tape la commande /add_product 1, notebook, 5, text contient « 1, notebook, 5 ».

    Le gestionnaire add_product extrait l’ID, le nom et la quantité du produit de la demande de l’utilisateur et se connecte à la base de données à l’aide de la fonction d’aide get_conn(). Il exécute également une opération SQL d’insertion pour ajouter le produit à la base de données. Si l’identifiant du produit existe déjà dans la base de données, le code traite l’erreur et répond que l’identifiant existe déjà.

  6. Ajoutez maintenant le reste des gestionnaires de commandes au fichier server.py.
    # command to check inventory for a product_id
    @app.command("/check_inventory")
    def check_inventory(ack, respond, command, request):
       # Acknowledge command request
       ack()
    
       # Extract payload from request
       id = request.body['text'].strip()
    
       # Get a database connection
       conn = None
       try:
           # get conn
           conn = get_conn()
    
           # get cursor
           cur = conn.cursor()
     
           # Fetch matching product with ID from database
           cur.execute(
               "SELECT * FROM products WHERE id=%s",
               (int(id),)
           )
    
           product = cur.fetchone()
    
           # close comms
           cur.close()
    
           if product is None:
               respond(f"No product with matching ID {id} found.")
           else:
               # Deconstruct tuple if the product exists
               _, name, quantity = product
              
               respond(f"""Product with ID {id} found:
                          name - {name},
                          quantity - {quantity}
                      """)
             
       except Exception as e:
           print("Connection error: %s", e)
             
       finally:
           # close connection
           if conn is not None:
               conn.close()
    
    # command to delete the matching product_id from inventory
    @app.command("/delete_product")
    def delete_product(ack, respond, command, request):
        #Acknowledge command request
        ack()
    
        # Extract payload from request
        id = request.body['text'].strip()
        
        # Get connection
        conn = None
        try:
            # Get connection
            conn = get_conn()
       	 
            # get cursor
            cur = conn.cursor()
       	 
            # Insert the product into the database
            cur.execute(
            	"DELETE FROM products WHERE id = %s",
            	(int(id),)
            )
            cur.close()
            conn.commit()
       	 
            # Response
            respond(f"Product with ID {id} deleted from inventory!")
        except Exception as e:
            print("Connection error: %s", e)
        finally:
            # close connection
            if conn is not None:
                conn.close()
    

    Ces deux gestionnaires de commandes interrogent et suppriment respectivement l’ID de produit correspondant dans l’inventaire.

Comment mancer le serveur

  1. Pour réunir l’initialisation de la base de données et la connexion à la socket, ajoutez les lignes suivantes à votre fichier server.py.
    # Start your app
    if __name__ == "__main__":
        # Initialize database on start
        init_db()
    
        # Connect socket
        handler = SocketModeHandler(app, os.environ["SLACK_APP_TOKEN"])
        handler.start()

    Vous devez initialiser SocketModeHandler avec votre jeton au niveau de l’application. Utilisez SLACK_APP_TOKEN pour accéder à la variable d’environnement déployée dans l’application Kinsta.

  2. Livrez les changements à votre dépôt distant pour les déployer automatiquement dans Kinsta. Maintenant, server.py initialise la base de données et établit la connexion socket. Kinsta va déclencher un redéploiement automatique de votre application Python.

Tester et dépanner votre application

Vous pouvez tester votre application sur Slack en utilisant les commandes Slash configurées.

    1. Allez dans l’espace de travail associé à votre application. Saisissez la barre oblique (‘/’) pour afficher les commandes de l’application :

      Le canal kinsta-demo.
      Le canal kinsta-demo.

    2. Testez chaque commande Slash. Par exemple, saisissez /hi. Vous obtenez la réponse « Hello ! »

      Réponse à la commande Hi.
      Réponse à la commande Hi.

    3. Testez ce qui se passe lorsque vous ajoutez deux fois le même produit. Exécutez deux fois la commande slash /add_product 1, notepad, 2.
      Ajout d'un produit deux fois.
      Ajout d’un produit deux fois.

      Comme le montre la capture d’écran ci-dessus, la première commande a fonctionné. Elle a ajouté un nouveau produit. La seconde commande a entraîné une réponse indiquant que l’identifiant existait déjà.

    4. Essayez de rechercher l’identifiant du produit que nous venons d’ajouter. Saisissez /check_inventory 1.
      Vérification de l'inventaire.
      Vérification de l’inventaire.

      La requête a renvoyé le produit avec l’ID correspondant.

    5. Enfin, essayez de supprimer le produit que vous avez ajouté. Tapez /delete_product 1.

      Suppression d'un produit.
      Suppression d’un produit.

Comment résoudre les problèmes

Lors de la configuration et du déploiement de votre application, vous pouvez rencontrer des erreurs à résoudre pour que votre application fonctionne correctement. Essayez les méthodes suivantes pour détecter et corriger les erreurs typiques.

      • Vérifiez vos jetons : Assurez-vous que vous configurez correctement votre jeton au niveau de l’application avec la portée connections:write pour permettre l’accès en mode Socket. Utilisez également les bons jetons pour la classe de l’application. Le jeton d’utilisateur du robot commence par xoxb-<...>. Utilisez le jeton de niveau application (xapp-<...>) pour la classe SocketModeHandler.
      • Vérifiez vos commandes slash : Assurez-vous d’avoir configuré les commandes Slash sur le tableau de bord de votre application Slack et d’avoir configuré les bons gestionnaires dans le code de votre serveur d’application.
      • Améliorez la gestion des erreurs : Assurez-vous que votre logique d’application gère correctement les erreurs, par exemple, lors de l’exécution d’opérations de base de données.

Résumé

Dans ce guide, vous avez appris à construire une application Python avec une communication en temps réel via les commandes Slash de Slack. Vous avez également appris à déployer l’application sur Kinsta.

L’intégration d’une application hébergée par Kinsta avec Slack permet aux utilisateurs d’apporter rapidement des modifications à l’aide des commandes Slash, ce qui améliore l’interactivité et l’efficacité du flux de travail tout en offrant un accès immédiat aux données en temps réel. Le personnel peut désormais ajouter, supprimer ou vérifier l’inventaire des produits en toute transparence sans quitter leur plateforme de communication, ce qui stimule la productivité au cours d’une journée de travail bien remplie.

Le PaaS de Kinsta offre encore plus de possibilités : vous pouvez connecter des applications et des bases de données, déployer des solutions complètes pour les sociétés et les entreprises. Et le meilleur ? Nous prenons en charge vos 20 premiers euros !

Jeremy Holcombe Kinsta

Rédacteur en chef du contenu et du marketing chez Kinsta, développeur web WordPress et rédacteur de contenu. En dehors de WordPress, j'aime la plage, le golf et le cinéma. J'ai aussi des problèmes avec les personnes de grande taille ;).