One place for hosting & domains

      données

      Comprendre les bases de données relationnelles


      Introduction

      Les systèmes de gestion des bases de données (SGDB ou DBMS en anglais) sont des programmes informatiques qui permettent aux utilisateurs d’interagir avec une base de données. Un SGDB permet aux utilisateurs de contrôler l’accès à une base de données, d’écrire des données, d’exécuter des requêtes et d’effectuer toute autre tâche liée à la gestion de base de données.

      Pour effectuer l’une de ces tâches, cependant, le SGDB doit avoir une sorte de modèle sous-jacent qui définit la manière dont les données sont organisées. Le modèle relationnel est une approche d’organisation des données qui ont trouvé un large usage dans le logiciel de base de données depuis sa conception initiale à la fin des années 1960, à tel point que, à partir de ce texte, quatre des cinq SGDB les plus populaires sont relationnels.

      Cet article conceptuel décrit l’historique du modèle relationnel, la manière dont les bases de données relationnelles organisent les données, et leur utilisation aujourd’hui.

      Histoire du modèle relationnel

      Les bases de données sont des groupes d’informations ou de données modélisés de manière logique**. Toute collecte de données est une base de données, quel que soit la manière dont elle est stockée ou l’endroit où elle est stockée. Même un classeur de fichiers contenant des informations sur les salaires est une base de données, tout comme une pile de formulaires de patients d’un hôpital ou la collecte d’informations sur les clients d’une entreprise répartis dans plusieurs endroits. Avant que le stockage et la gestion des données à l’aide d’ordinateurs ne soit une pratique courante, les bases de données physiques comme celles-ci étaient les seules dont disposaient les organisations gouvernementales et commerciales qui avaient besoin de stocker des informations.

      Vers le milieu du XXe siècle, les développements en informatique ont conduit à la mise au point de machines plus puissantes, ainsi qu’à une plus grande capacité de stockage local et externe. Ces progrès ont conduit les informaticiens à commencer à reconnaître le potentiel de ces machines pour stocker et gérer des quantités de données toujours plus importantes.

      Cependant, il n’existait pas de théories sur la manière dont les ordinateurs pouvaient organiser les données de manière logique et significative. C’est une chose de stocker des données non triées sur une machine, mais il est beaucoup plus compliqué de concevoir des systèmes qui vous permettent d’ajouter, récupérer, trier et gérer ces données d’une manière cohérente et pratique. La nécessité d’un cadre logique pour stocker et organiser les données a conduit à un certain nombre de propositions d’utilisation des ordinateurs pour la gestion des données.

      L’un des premiers modèles de base de données était le modèle hiérarchique, dans lequel les données sont organisées dans une structure arborescente ressemblant semblables aux systèmes de fichiers modernes. L’exemple suivant montre à quoi pourrait ressembler la disposition d’une partie d’une base de données hiérarchique utilisée pour classer les animaux : :

      Exemple Base de données hiérarchiques : catégorisation des animaux

      Le modèle hiérarchique a été largement appliqué dans les systèmes de gestion de base de données, mais il s’est également avéré peu flexible. Dans ce modèle, même si les enregistrements individuels peuvent avoir plusieurs enregistrements “enfant”, chaque enregistrement ne peut avoir qu’un seul “parent” dans la hiérarchie. Pour cette raison, ces bases de données hiérarchiques antérieures se limitaient à représenter uniquement des relations “”un à un” et “un à plusieurs” Cette absence de relations “de plusieurs à plusieurs”  pourrait entraîner des problèmes lorsque vous travaillez avec des points de données que vous souhaitez associer à plus d’un parent.

      À la fin des années 1960, Edgar F. Codd, un informaticien chez IBM, a mis au point le modèle relationnel de gestion de base de données. Le modèle relationnel de Codd a permis à des enregistrements individuels d’être associés à plus d’une table, permettant ainsi des relations “de plusieurs à plusieurs” entre les points de données en plus des relations “d’un à plusieurs”.  Cela a permis une plus grande flexibilité que d’autres modèles existants en ce qui concerne la conception des structures de base de données, ce qui signifie que les systèmes de gestion de bases de données relationnelles (SGBDR) pouvaient répondre à un éventail beaucoup plus large de besoins commerciaux.

      Codd a proposé un langage pour gérer les données relationnelles, connu sous le nom d’Alpha, qui a influencé le développement de langages de base de données ultérieurs. Deux des collègues de Codd chez IBM, Donald Chamberlin et Raymond Boyce, ont créé un tel langage inspirée d’Alpha. Ils ont appelé leur langue SEQUEL, anagramme de   S tructured  E nglish  Que ry  L anguage, mais en raison d’une marque existante ils ont raccourci le nom de leur langage à SQL (appelé de manière plus formelle Structured Query Language).

      En raison de contraintes matérielles, les premières bases de données relationnelles étaient excessivement lentes, et il a fallu un certain temps avant que la technologie ne se généralise. Mais au milieu des années 1980, le modèle relationnel de Codd a été mis en œuvre dans un certain nombre de produits de gestion de base de données commerciales d’IBM et de ses concurrents. Ces entreprises ont également suivi l’initiative d’IBM en développant et en mettant en œuvre leurs propres dialectes de SQL. En 1987, l’American National Standards Institute et l’International Organization for Standardization avaient tous deux ratifié et publié des normes pour SQL, consolidant ainsi son statut de langage accepté pour la gestion des SGBDR.

      L’utilisation du modèle relationnel dans plusieurs industries a conduit à sa reconnaissance en tant que modèle standard de gestion des données. Même avec l’essor de différentes bases de données NoSQL ces dernières années, les bases de données relationnelles restent les outils dominants pour le stockage et l’organisation des données.

      Maintenant que vous avez une compréhension générale de l’histoire du modèle relationnel, examinons de plus près la manière dont le modèle organise les données.

      Les éléments les plus fondamentaux du modèle relationnel sont les relations que les utilisateurs et les SGBDR modernes reconnaissent comme tableaux. Une relation est un ensemble de tuples, ou de lignes dans une table, avec chaque tuple partageant un ensemble d’attributs, ou colonnes :

      Exemple de diagramme indiquant comment les relations, les tuples et les attributs sont liés les uns aux autres

      Une colonne est la plus petite structure organisationnelle d’une base de données relationnelle, et représente les différentes facettes qui définissent les enregistrements de la table. D’où leur nom plus formel, les attributs. Vous pouvez penser à chaque tuple comme une instance unique de n’importe quel type de personnes, objets, événements ou associations que la table contient. Ces instances peuvent être des éléments comme les employés d’une entreprise, les ventes d’une entreprise en ligne ou les résultats de test en laboratoire. Par exemple, dans une table contenant les enregistrements des enseignants d’une école, les tuples peuvent avoir des attributs comme name, subjects, start_date, etc.

      Lorsque vous créez des colonnes, vous spécifiez un type de données qui dicte le type d’entrées autorisées dans cette colonne. Les SGBDR mettent souvent en œuvre leurs propres types de données uniques, qui peuvent ne pas être directement interchangeables avec des types de données similaires dans d’autres systèmes. Les types de données les plus courants comprennent les dates, les chaînes de caractères, les entiers et les Booléens.

      Dans le modèle relationnel, chaque table contient au moins une colonne qui peut être utilisée pour identifier de manière unique chaque ligne, appelée clé primaire. C’est important, car cela signifie que les utilisateurs n’ont pas à savoir où leurs données sont physiquement stockées sur une machine, au lieu de cela, leur SGBD peut suivre chaque enregistrement et les renvoyer sur une base ad hoc. Cela signifie que les enregistrements n’ont pas d’ordre logique défini, et que les utilisateurs ont la possibilité de renvoyer leurs données dans n’importe quel ordre ou par les filtres qu’ils souhaitent.

      Si vous souhaitez associer deux tables l’une à l’autre, vous pouvez le faire avec une clé étrangère. Une clé étrangère est essentiellement une copie de la clé primaire d’une table (la table “parent”) insérée dans une colonne d’une autre table (l’“enfant”). L’exemple suivant met en évidence la relation entre deux tableaux, l’un utilisé pour enregistrer les informations relatives aux employés d’une entreprise et l’autre utilisée pour suivre les ventes de l’entreprise. Dans cet exemple, la clé principale du tableau EMPLOYEES est utilisée comme clé étrangère du tableau SALES :

      Diagramme illustrant comment la clé principale du tableau de EMPLOYEE agit en tant que clé étrangère du tableau SALES

      Si vous essayez d’ajouter un enregistrement au tableau enfant et que la valeur saisie dans la colonne de clé étrangère n’existe pas dans la clé primaire du tableau parent, l’instruction d’insertion sera invalide. Cela aide à maintenir l’intégrité au niveau des relations, car les lignes des deux tableaux seront toujours correctement reliées.

      Les éléments structurels du modèle relationnel aident à conserver les données stockées de manière organisée, mais la conservation des données n’est utile que si vous pouvez les récupérer. Pour récupérer des informations d’un SGBDR, vous pouvez émettre une query ou une requête structurée d’un ensemble d’informations. Comme mentionné précédemment, la plupart des bases de données relationnelles utilisent SQL pour gérer et interroger les données. SQL vous permet de filtrer et de manipuler les résultats de requête avec une variété de clauses, de prédicats et d’expressions, vous donnant un contrôle précis sur les données qui apparaîtront dans l’ensemble de résultats.

      Avantages et limitations des bases de données relationnelles

      En tenant compte de la structure organisationnelle sous-jacente des bases de données relationnelles, examinons quelques-uns de leurs avantages et de leurs inconvénients.

      Aujourd’hui, tant SQL que les bases de données qui l’implémentent s’écartent du modèle relationnel de Codd de plusieurs façons. Par exemple, le modèle de Codd dicte que chaque ligne d’une table doit être unique tandis que, pour des raisons pratiques, la plupart des bases de données relationnelles modernes permettent de dupliquer les lignes. Certaines personnes ne considèrent pas les bases de données SQL comme de véritables bases de données relationnelles si elles ne respectent pas chacune des spécifications du modèle relationnel de Codd. En termes pratiques, cependant, tout SGBD qui utilise SQL et qui adhère au moins en partie au modèle relationnel est susceptible d’être appelé un système de gestion de base de données relationnelles.

      Bien que les bases de données relationnelles aient rapidement gagné en popularité, certaines des lacunes du modèle relationnel ont commencé à apparaître lorsque les données prenaient de la valeur et que les entreprises ont commencé à en stocker davantage. La scalabilité horizontale, ou scaling out, est la pratique qui consiste à ajouter plus de machines à une pile existante afin de répartir la charge et de permettre un traffic plus important et un traitement plus rapide. Cette opération est souvent opposée à la mise à la scalabilité verticale qui implique la mise à niveau du matériel d’un serveur existant, généralement en ajoutant plus de RAM ou de CPU.

      La raison pour laquelle il est difficile de faire évoluer une base de données relationnelle horizontalement est liée au fait que le modèle relationnel est conçu pour assurer la cohérence, ce qui signifie que les clients qui interrogent la même base de données récupèrent toujours les mêmes données. Si vous devez faire évoluer une base de données relationnelle horizontalement sur plusieurs machines, il devient difficile d’en garantir la cohérence car les clients peuvent parfois écrire des données sur un nœud, sans le faire sur les autres. Il y aurait probablement un délai entre l’écriture initiale et le moment où les autres nœuds sont mis à jour pour refléter les changements, ce qui entraînerait des incohérences entre eux.

      Une autre limitation présentée par les SGDBR est que le modèle relationnel a été conçu pour gérer des données structurées, ou des données qui s’alignent avec un type de données prédéfini ou qui sont au moins organisées d’une manière prédéterminée, ce qui les rend facilement triables et consultables. Toutefois, avec le développement de l’informatique personnelle et l’essor d’Internet au début des années 1990, les données non structurées — telles que les messages électroniques, les photos, les vidéos, etc. — sont devenues plus fréquentes.

      Rien de cela ne veut dire que les bases de données relationnelles ne sont pas utiles. Au contraire, le modèle relationnel est toujours le cadre dominant de la gestion des données après plus de 40 ans. Leur prévalence et leur longévité signifient que les bases de données relationnelles sont une technologie mature, qui est en soi l’un de leurs avantages majeurs. Il existe de nombreuses applications conçues pour fonctionner avec le modèle relationnel, ainsi que de nombreux administrateurs de base de données de carrière qui sont des experts en matière de bases de données relationnelles. Il existe également un large éventail de ressources disponibles sur papier et en ligne pour ceux qui souhaitent se lancer dans les bases de données relationnelles.

      Un autre avantage des bases de données relationnelles est que presque tous les SGBDR prennent en charge les transactions. Une transaction consiste en une ou plusieurs des instructions SQL individuelles exécutées en séquence comme une seule unité de travail. Les transactions présentent une approche de type tout-ou rien, ce qui signifie que chaque instruction SQL de la transaction doit être valide ; sinon, la transaction entière échouera. Ceci est très utile pour garantir l’intégrité des données lors de modifications de plusieurs lignes ou tableaux.

      Enfin, les bases de données relationnelles sont extrêmement flexibles. Elles ont été utilisées pour construire une grande variété d’applications différentes, et continuent de fonctionner efficacement même avec de très grandes quantités de données. SQL est également extrêmement puissant, vous permettant d’ajouter et de modifier des données au vol, ainsi que de modifier la structure des schémas et des tableaux de base de données sans incidence sur les données existantes.

      Conclusion

      Grâce à leur flexibilité et à leur conception pour l’intégrité des données, les bases de données relationnelles sont toujours le principal moyen de gérer et de stocker les données plus de cinquante ans après leur conception. Même avec l’essor de diverses bases de données NoSQL ces dernières années, la compréhension du modèle relationnel et de la manière de travailler avec les SGBDR sont la clé pour tous ceux qui veulent construire des applications qui exploitent la puissance des données.

      Pour en savoir plus sur quelques SGBDR open source populaires, nous vous encourageons à consulter notre comparaison de différentes bases de données SQL relationnelles open-source. Si vous souhaitez en savoir plus sur les bases de données en général, nous vous encourageons à consulter notre bibliothèque complète de contenus liés aux bases de données.



      Source link

      Comment utiliser le type de données BLOB MySQL pour stocker des images avec PHP sur Ubuntu 18.04


      L’auteur a sélectionné Girls Who Code pour recevoir un don dans le cadre de l’initiative Écrire pour des donations. 

      Introduction

      Un Binary Large Object (BLOB) est un type de données MySQL qui peut stocker des données binaires telles que des images, du multimédia et des fichiers PDF.

      Lors de la création d’applications qui nécessitent une base de données étroitement couplée où les images doivent être synchronisées avec les données connexes (par exemple, un portail d’employés, une base de données d’étudiants ou une application financière), vous pouvez trouver pratique de stocker des images telles que les photos et signatures de passeport des étudiants dans une base de données MySQL avec d’autres informations connexes.

      C’est là qu’intervient le type de données MySQL BLOB. Cette approche de programmation élimine la nécessité de créer un système de fichiers séparé pour le stockage des images. Le système centralise également la base de données, la rendant plus portable et plus sécurisée car les données sont isolées du système de fichiers. La création de sauvegardes est également plus transparente puisque vous pouvez créer un seul fichier MySQL dump qui contient toutes vos données.

      La récupération des données est plus rapide, et lors de la création des enregistrements, vous pouvez être sûr que les règles de validation des données et l’intégrité référentielle sont maintenues, en particulier lors de l’utilisation des transactions MySQL.

      Dans ce tutoriel, vous allez utiliser le type de données MySQL BLOB pour stocker des images avec PHP sur Ubuntu 18.04.

      Conditions préalables

      Pour suivre ce guide, vous aurez besoin des éléments suivants :

      Étape 1 — Création d’une base de données

      Vous commencerez par créer un exemple de base de données de votre projet. Pour ce faire, connectez-vous en SSH à votre serveur, puis exécutez la commande suivante pour vous connecter à votre serveur MySQL en tant que root :

      Entrez le mot de passe root de votre base de données MySQL et appuyez sur ENTER pour continuer.

      Ensuite, exécutez la commande suivante pour créer une base de données. Dans ce tutoriel, nous l’appellerons test_company :

      • CREATE DATABASE test_company;

      Une fois la base de données créée, vous verrez le résultat suivant :

      Output

      Query OK, 1 row affected (0.01 sec)

      Ensuite, créez un compte test_user sur le serveur MySQL et n’oubliez pas de remplacer PASSWORD par un mot de passe fort :

      • CREATE USER 'test_user'@'localhost' IDENTIFIED BY 'PASSWORD';

      Vous verrez la sortie suivante :

      Output

      Query OK, 0 rows affected (0.01 sec)

      Pour accorder des privilèges complets à test_user sur la base de données test_company, exécutez :

      • GRANT ALL PRIVILEGES ON test_company.* TO 'test_user'@'localhost';

      Vérifiez que vous obtenez le résultat suivant :

      Output

      Query OK, 0 rows affected (0.01 sec)

      Enfin, videz la table des privilèges afin que MySQL recharge les autorisations :

      Assurez-vous de voir le résultat suivant :

      Output

      Query OK, 0 rows affected (0.01 sec)

      Maintenant que la base de données test_company et test_user sont prêts, vous allez passer à la création du tableau products pour le stockage d’échantillons de produits.  Vous utiliserez cette table plus tard pour insérer et récupérer des enregistrements afin de faire la démonstration du fonctionnement de MySQL BLOB.

      Déconnectez-vous du serveur MySQL :

      Ensuite, reconnectez-vous avec les informations d’identification du test_user que vous avez créé :

      Entrez le mot de passe du test_user et appuyez sur ENTER (ENTRÉE) pour continuer. Ensuite, passez à la base de données test_company en tapant ce qui suit :

      Une fois la base de données test_company sélectionnée, MySQL affichera :

      Output

      Database changed

      Ensuite, créez un tableau products en exécutant :

      • CREATE TABLE `products` (product_id BIGINT PRIMARY KEY AUTO_INCREMENT, product_name VARCHAR(50), price DOUBLE, product_image BLOB) ENGINE = InnoDB;

      Cette commande crée un tableau nommé products. Le tableau contient quatre colonnes :

      • product_id : Cette colonne utilise un type de données BIGINT afin d’accueillir une grande liste de produits jusqu’à un maximum de 2⁶³-1 articles. Vous avez marqué la colonne comme PRIMARY KEY pour identifier les produits de manière unique. Pour que MySQL puisse gérer la génération de nouveaux identifiants pour des colonnes insérées, vous avez utilisé le mot-clé AUTO_INCREMENT.

      • product_name : Cette colonne contient les noms des produits. Vous avez utilisé le type de données VARCHAR car ce champ gère généralement des caractères alphanumériques jusqu’à un maximum de 50 caractères — la limite de 50 n’est qu’une valeur hypothétique utilisée pour les besoins de ce tutoriel.

      • price : à des fins de démonstration, votre tableau products contient la colonne price pour stocker le prix de détail des produits. Comme certains produits peuvent avoir des valeurs flottantes (par exemple, 23.69, 45,36, 102.99), vous avez utilisé le type de données DOUBLE.

      • product_image : Cette colonne utilise un type de données BLOB pour stocker les données binaires réelles des images des produits.

      Vous avez utilisé le moteur de stockage InnoDB pour la table afin de prendre en charge un large éventail de fonctionnalités, y compris les transactions MySQL. Après avoir exécuté ceci pour créer le tableau products, vous verrez le résultat suivant :

      Output

      Query OK, 0 rows affected (0.03 sec)

      Déconnectez-vous de votre serveur MySQL :

      Vous obtiendrez le résultat suivant

      Output

      Bye

      Le tableau products est maintenant prêt à stocker quelques enregistrements, y compris des images des produits et vous le remplirez avec quelques produits lors de la prochaine étape.

      Étape 2 — Création d’un script PHP pour connecter et alimenter la base de données

      Au cours de cette étape, vous allez créer un script PHP qui se connectera à la base de données MySQL que vous avez créée à l’Etape 1. Le script préparera trois exemples de produits et les insérera dans le tableau products.

      Pour créer le code PHP, ouvrez un nouveau fichier avec l’éditeur de texte :

      • sudo nano /var/www/html/config.php

      Entrez ensuite dans le fichier et remplacez PASSWORD avec le mot de passe de test_user que vous avez créé à l’Étape 1 :

      /var/www/html/config.php

      <?php
      
      define('DB_NAME', 'test_company');
      define('DB_USER', 'test_user');
      define('DB_PASSWORD', 'PASSWORD');
      define('DB_HOST', 'localhost');
      
      $pdo = new PDO("mysql:host=" . DB_HOST . "; dbname=" . DB_NAME, DB_USER, DB_PASSWORD);
      $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
      
      

      Enregistrez et fermez le fichier.

      Dans ce fichier, vous avez utilisé quatre constantes PHP pour vous connecter à la base de données MySQL que vous avez créée à l’Étape 1 :

      • DB_NAME : Cette constante contient le nom de la base de données test_company.

      • DB_USER : Cette variable contient le nom de l’utilisateur test_user.

      • DB_PASSWORD : Cette constante stocke le PASSWORD MySQL du compte test_user.

      • DB_HOST : Représente le serveur sur lequel réside la base de données. Dans ce cas, vous utilisez le serveur localhost.

      La ligne suivante de votre fichier initie un PHP Data Object (PDO) et se connecte à la base de données MySQL :

      ...
      $pdo = new PDO("mysql:host=" . DB_HOST . "; dbname=" . DB_NAME, DB_USER, DB_PASSWORD);
      ...
      

      Vers la fin du fichier, vous avez défini quelques attributs PDO :

      • ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION : cet attribut indique au PDO de lancer une exception qui peut être enregistrée à des fins de débogage.
      • ATTR_EMULATE_PREPARES, false : Cette option augmente la sécurité en demandant au moteur de base de données MySQL de faire le préparation au lieu de PDO.

      Vous allez inclure le fichier /var/www/html/config.php dans deux scripts PHP que vous créerez ensuite pour insérer et récupérer des enregistrements, respectivement.

      Tout d’abord, créez le script /var/www/html/insert_products.php PHP pour l’insertion des enregistrements dans le tableau products :

      • sudo nano /var/www/html/insert_products.php

      Ajoutez ensuite les informations suivantes dans le fichier /var/www/html/insert_products.php :

      /var/www/html/insert_products.php

      <?php
      
      require_once 'config.php';
      
      $products = [];
      
      $products[] = [
                    'product_name' => 'VIRTUAL SERVERS',
                    'price' => 5,
                    'product_image' => file_get_contents("https://i.imgur.com/VEIKbp0.png")
                    ];
      
      $products[] = [
                    'product_name' => 'MANAGED KUBERNETES',
                    'price' => 30,
                    'product_image' => file_get_contents("https://i.imgur.com/cCc9Gw9.png")
                    ];
      
      $products[] = [
                    'product_name' => 'MySQL DATABASES',
                    'price' => 15,
                    'product_image' => file_get_contents("https://i.imgur.com/UYcHkKD.png" )
                    ];
      
      $sql = "INSERT INTO products(product_name, price, product_image) VALUES (:product_name, :price, :product_image)";
      
      foreach ($products as $product) {
          $stmt = $pdo->prepare($sql);
          $stmt->execute($product);
      }
      
      echo "Records inserted successfully";
      

      Enregistrez et fermez le fichier.

      Dans le fichier, vous avez inclus le fichier config.php en haut. C’est le premier fichier que vous avez créé pour définir les variables de la base de données et vous connecter à la base de données. Le fichier initie également un objet PDO et le stocke dans une variable $pdo.

      Ensuite, vous avez créé un tableau des données des produits à insérer dans la base de données. Outre product_name et price, qui sont préparés respectivement sous forme de chaînes de caractères et de valeurs numériques, le script utilise la fonction intégrée file_get_contents de PHP pour lire les images d’une source externe et les transmettre sous forme de chaînes de caractères à la colonne product_image.

      Ensuite, vous avez préparé une instruction SQL et utilisé l’instruction foreach{...} de PHP pour insérer chaque produit dans la base de données.

      Pour exécuter le fichier /var/www/html/insert_products.php, exécutez-le dans la fenêtre de votre navigateur en utilisant l’URL suivante. N’oubliez pas de remplacer your-server-IP par l’adresse IP publique de votre serveur :

      http://your-server-IP/insert_products.php
      

      Après l’exécution du fichier, vous verrez un message de confirmation dans votre navigateur confirmant que les enregistrements ont été insérés dans la base de données.

      Un message de réussite montrant que les enregistrements ont été insérés dans la base de données

      Vous avez correctement inséré trois enregistrements contenant des images de produit dans la table products. Dans l’étape suivante, vous allez créer un script PHP pour récupérer ces enregistrements et les afficher dans votre navigateur.

      Étape 3 — Afficher les informations des produits à partir de la base de données MySQL

      Avec les informations et les images des produits dans la base de données, vous allez maintenant coder un autre script PHP qui interroge et affiche les informations des produits dans un tableau HTML sur votre navigateur.

      Pour créer le fichier, tapez ce qui suit :

      • sudo nano /var/www/html/display_products.php

      Entrez ensuite les informations suivantes dans le fichier :

      /var/www/html/display_products.php

      <html>
        <title>Using BLOB and MySQL</title>
        <body>
      
        <?php
      
        require_once 'config.php';
      
        $sql = "SELECT * FROM products";
        $stmt = $pdo->prepare($sql);
        $stmt->execute();
        ?>
      
        <table border="1" align = 'center'> <caption>Products Database</caption>
          <tr>
            <th>Product Id</th>
            <th>Product Name</th>
            <th>Price</th>
            <th>Product Image</th>
          </tr>
      
        <?php
        while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
            echo '<tr>';
            echo '<td>' . $row['product_id'] . '</td>';
            echo '<td>' . $row['product_name'] . '</td>';
            echo '<td>' . $row['price'] . '</td>';
            echo '<td>' .
            '<img src = "data:image/png;base64,' . base64_encode($row['product_image']) . '" width = "50px" height = "50px"/>'
            . '</td>';
            echo '</tr>';
        }
        ?>
      
        </table>
        </body>
      </html>
      

      Sauvegardez les modifications du fichier et fermez-le.

      Ici, vous avez de nouveau inclus le fichier config.php afin de vous connecter à la base de données. Ensuite, vous avez préparé et exécuté une instruction SQL en utilisant PDO pour récupérer tous les éléments du tableau products à l’aide de la commande SELECT * FROM products.

      Ensuite, vous avez créé un tableau HTML et l’avez rempli avec les données des produits en utilisant l’instruction PHP while() {...}. La ligne $row = $stmt->fetch(PDO::FETCH_ASSOC) interroge la base de données et stocke le résultat dans la variable $row sous la forme d’un tableau multidimensionnel, que vous avez ensuite affiché dans une colonne du tableau HTML en utilisant la syntaxe $row['column_name'].

      Les images de la colonne product_image sont jointes dans les balises <img src = "">. Vous avez utilisé les attributs width et height pour redimensionner les images à une taille plus petite qui peut tenir dans la colonne du tableau HTML.

      Afin de convertir en images les données détenues par le type de données BLOB, vous avez utilisé la fonction PHP base64_encode intégrée et la syntaxe suivante pour le schéma Data URI :

      data:media_type;base64, base_64_encoded_data
      

      Dans ce cas, l’image/png est le media_type et la chaîne codée en Base64 de la colonne product_image est la base_64_encoded_data.

      Ensuite, exécutez le fichier display_products.php dans un navigateur web en tapant l’adresse suivante :

      http://your-server-IP/display_products.php
      

      Après avoir exécuté le fichier display_products.php dans votre navigateur, vous verrez un tableau HTML avec une liste de produits et d’images associées.

      Liste des produits de la base de données MySQL

      Cela confirme que le script PHP pour la récupération des images de MySQL fonctionne comme prévu.

      Conclusion

      Dans ce guide, vous avez utilisé le type de données MySQL BLOB pour stocker et afficher des images avec PHP sur Ubuntu 18.04. Vous avez également vu les avantages fondamentaux du stockage des images dans une base de données par rapport au stockage dans un système de fichiers. Il s’agit notamment de la portabilité, de la sécurité et de la facilité de sauvegarde. Si vous créez une application telle qu’un portail d’étudiants ou une base de données d’employés qui nécessite de stocker ensemble des informations et des images connexes, alors cette technologie peut vous être d’une grande utilité.

      Pour plus d’informations sur les types de données pris en charge dans MySQL, suivez le guide des Types de données MySQL. Si vous êtes intéressé par d’autres contenus relatifs à MySQL et PHP, consultez les tutoriels suivants :



      Source link

      Comment afficher les données de l’API DigitalOcean avec Django


      L’auteur a choisi Mozilla Foundation pour recevoir un don dans le cadre du programme Write for Donations.

      Introduction

      Comme la demande de développement full-stack continue de croître, les cadres web rendent les flux de développement moins lourds et plus efficaces ; Django est l’un de ces cadres. Django a été utilisé sur de grands sites web tels que Mozilla, Pinterest et Instagram. Contrairement à Flask, qui est un micro-cadre neutre, le package Django PyPI comprend tout ce dont vous auriez besoin pour un développement full-stack ; il n’est pas nécessaire de mettre en place une base de données ou un panneau de contrôle pour le développement.

      Un cas d’utilisation courant de Django consiste à l’utiliser pour afficher des informations provenant d’API (telles que les posts Instagram ou les référentiels GitHub) dans vos propres sites et apps web. Bien que cela soit possible avec d’autres cadres, la philosophie “ batteries incluses ” de Django signifie qu’il y aura moins de problèmes et qu’il faudra moins de paquets pour obtenir le même résultat.

      Dans ce tutoriel, vous allez construire un projet Django qui affichera les informations droplet de votre compte DigitalOcean en utilisant l’API DigitalOcean v2. Plus précisément, vous allez créer un site web qui affichera un tableau de Droplets énumérant chacun(e) de leurs adresses IP, ID, régions d’hébergement et ressources. Votre site web utilisera BulmaCSS pour le style de la page afin que vous puissiez vous concentrer sur le développement tout en ayant quelque chose d’agréable à regarder à la fin.

      Une fois que vous avez terminé ce tutoriel, vous aurez un projet Django capable de produire une page web qui ressemble à ceci :

      Modèle avec tableau de données droplet

      Conditions préalables

      Avant de commencer ce guide, vous aurez besoin des éléments suivants :

      • Un compte DigitalOcean avec au moins un droplet, et un jeton d’accès personnel. Veillez à enregistrer le jeton dans un endroit sûr ; vous en aurez besoin plus tard dans ce tutoriel.
      • Être familiarisé avec les requêtes adressées aux API. Pour obtenir un tutoriel complet sur le travail avec API, consultez Comment utiliser les API web en Python3.
      • Un environnement virtuel local pour Python afin de maintenir les dépendances. Dans ce tutoriel, nous utiliserons le nom do_django_api pour notre répertoire de projet et env pour notre environnement virtuel.
      • Être familiarisé avec la logique du modèle de Django pour le rendu de pages avec des données API.
      • Être familiarisé avec la logique de vue de Django pour traiter les données reçues de l’API et les donner à un modèle pour le rendu.

      Étape 1 – Création d’un projet Django de base

      À partir de l’environnement virtuel env, installez Django

      Vous pouvez maintenant démarrer un projet Django et exécuter certaines commandes initiales d’installation.

      Utilisez django-admin startproject <nom> pour créer un sous-répertoire dans le dossier du projet nommé d’après votre projet Django, puis passez dans ce répertoire.

      • django-admin startproject do_django_project
      • cd do_django_project

      Une fois qu’il est créé, à l’intérieur de ce sous-répertoire, vous trouverez manage.py, qui est le moyen habituel d’interagir avec Django et d’exécuter votre projet. Utilisez migrate pour mettre à jour la base de données de développement de Django :

      • python3 manage.py migrate

      Vous verrez des sorties qui ressemblent à ceci pendant que la base de données se met à jour :

      Output

      Operations to perform: Apply all migrations: admin, auth, contenttypes, sessions Running migrations: Applying contenttypes.0001_initial... OK Applying auth.0001_initial... OK Applying admin.0001_initial... OK Applying admin.0002_logentry_remove_auto_add... OK Applying admin.0003_logentry_add_action_flag_choices... OK Applying contenttypes.0002_remove_content_type_name... OK Applying auth.0002_alter_permission_name_max_length... OK Applying auth.0003_alter_user_email_max_length... OK Applying auth.0004_alter_user_username_opts... OK Applying auth.0005_alter_user_last_login_null... OK Applying auth.0006_require_contenttypes_0002... OK Applying auth.0007_alter_validators_add_error_messages... OK Applying auth.0008_alter_user_username_max_length... OK Applying auth.0009_alter_user_last_name_max_length... OK Applying auth.0010_alter_group_name_max_length... OK Applying auth.0011_update_proxy_permissions... OK Applying sessions.0001_initial... OK

      Ensuite, utilisez la commande runserver pour exécuter le projet afin que vous puissiez le tester :

      • python3 manage.py runserver

      La sortie ressemblera à ceci pendant que le serveur démarre :

      Output

      Watching for file changes with StatReloader Performing system checks... System check identified no issues (0 silenced). September 22, 2019 - 22:57:07 Django version 2.2.5, using settings 'do_django_project.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C.

      Vous avez maintenant un projet Django de base et un serveur de développement qui fonctionne. Pour visualiser votre serveur de développement en cours de fonctionnement, visitez le site 127.0.0.1:8000 dans un navigateur. Cela affichera la page de démarrage Django :

      Page d'accueil générique de Django

      Ensuite, vous allez créer une app Django et configurer votre projet pour qu’il lance une vue à partir de cette app, de façon à voir quelque chose de plus intéressant que la page par défaut.

      Étape 1 – Création d’une app Django de base

      Dans cette étape, vous allez créer le squelette de l’app qui contiendra vos résultats Droplet. Vous reviendrez dans cette app plus tard, une fois que vous aurez configuré l’appel API pour l’alimenter avec des données.

      Vérifiez que vous vous trouvez dans le répertoire do_django_project et créez une app Django en utilisant la commande suivante :

      • python3 manage.py startapp display_droplets

      Vous devez maintenant ajouter la nouvelle app à INSTALLED_APPS dans le fichier settings.py, de sorte que Django la reconnaisse. settings.py est un fichier de configuration Django qui est situé dans un autre sous-répertoire du projet Django et qui a le même nom que le dossier du projet (do_django_project). Django a créé les deux dossiers pour vous. Passez au répertoire do_django_project

      Modifiez settings.py dans l’éditeur de votre choix :

      Ajoutez votre nouvelle app à la section INSTALLED_APPS du fichier :

      do_django_api/do_django_project/do_django_project/settings.py

      INSTALLED_APPS = [
          'django.contrib.admin',
          'django.contrib.auth',
          'django.contrib.contenttypes',
          'django.contrib.sessions',
          'django.contrib.messages',
          'django.contrib.staticfiles',
          # The new app
          'display_droplets',
      ]
      

      Enregistrez et fermez le fichier lorsque vous avez fini de le modifier.

      Fonction GetDroplets View

      Ensuite, vous allez créer une fonction, GetDroplets, dans le fichier views.py de l’app display_droplets. Cette fonction rendra le modèle que vous utiliserez pour afficher les données Droplet, en tant que context, à partir de l’API. context est un dictionnaire qui est utilisé pour prendre des données du code Python et les envoyer à un modèle HTML afin qu’elles puissent être affichées dans une page web. 

      Passez au répertoire display_droplets :

      • cd ..
      • cd display_droplets

      Ouvrez views.py pour le modifier :

      Ajoutez le code suivant au fichier :

      do_django_api/do_django_project/display_droplets/views.py

      from django.views.generic import TemplateView
      
      class GetDroplets(TemplateView):
          template_name = 'droplets.html'
          def get_context_data(self, *args, **kwargs):
              pass
      

      Enregistrez et fermez le fichier.

      Plus tard, vous allez alimenter cette fonction et créer le fichier droplets.html ; mais d’abord, configurons urls.py pour appeler cette fonction lorsque vous visiterez le répertoire root du serveur de développement (127.0.0.1:8000).

      Revenez au répertoire do_django_project :

      • cd ..
      • cd do_django_project

      Ouvrez urls.py pour le modifier :

      Ajoutez une déclaration import pour GetDroplets, puis ajoutez un chemin supplémentaire à urlpatterns qui pointera vers la nouvelle vue.

      do_django_api/do_django_project/do_django_project/urls.py

      from django.contrib import admin
      from django.urls import path
      from display_droplets.views import GetDroplets
      
      urlpatterns = [
          path('admin/', admin.site.urls),
          path('', GetDroplets.as_view(template_name='droplets.html'), name='Droplet View'),
      ]
      

      Si vous souhaitez créer vos propres chemins personnalisés, le premier paramètre est l’URL (comme exemple.com/**admin**), le deuxième paramètre est la fonction à appeler pour produire la page web, et le troisième est juste un nom pour le chemin.

      Enregistrez et fermez le fichier.

      Modèle de droplets

      Ensuite, vous allez travailler avec des modèles. Les modèles sont des fichiers HTML que Django utilise pour créer des pages web. Dans le cas présent, vous utiliserez un modèle pour construire une page HTML qui affiche les données API.

      Revenez au répertoire display_droplets​​​​ :

      • cd ..
      • cd display_droplets

      À l’intérieur de ce répertoire, créez un dossier modèle et passez à ce répertoire :

      • mkdir templates
      • cd templates

      Créez droplets.html et ouvrez-le pour le modifier :

      Afin d’éviter d’avoir à écrire un quelconque CSS pour ce projet, nous utiliserons Bulma CSS car c’est un cadre CSS gratuit et léger qui vous permet de créer des pages web soignées simplement en ajoutant quelques attributs de classe au HTML.

      Maintenant, créons un modèle avec une barre de navigation de base. Ajoutez le code suivant au fichier droplets.html​​​ :

      do_django_api/do_django_project/display_droplets/templates/droplets.html

      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>DigitalOcean Droplets</title>
          <link crossorigin="anonymous"
                href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.4/css/bulma.min.css"
                integrity="sha256-8B1OaG0zT7uYA572S2xOxWACq9NXYPQ+U5kHPV1bJN4="
                rel="stylesheet"/>
          <link rel="shortcut icon" type="image/png" href="https://assets.digitalocean.com/logos/favicon.png"/>
      </head>
      <body>
      <nav aria-label="main navigation" class="navbar is-light" role="navigation">
          <div class="navbar-brand">
              <div class="navbar-item">
                  <img atl="DigitalOcean" src="https://assets.digitalocean.com/logos/DO_Logo_icon_blue.png"
                       style="margin-right: 0.5em;">Droplets
              </div>
          </div>
      </nav>
      </body>
      </html>
      

      Enregistrez et fermez le fichier.

      Ce code importe Bulma en HTML standard et crée une barre nav affichant “Droplets”.

      Rafraîchissez l’onglet de votre navigateur pour visualiser les modifications que vous avez apportées au modèle.

      Modèle avec Header basique

      Jusqu’à présent, vous n’avez touché à rien en rapport avec les API ; vous avez créé une base pour le projet. Ensuite, vous mettrez cette page à profit en faisant un appel API et en présentant les données des Droplets.

      Étape 3 – Création de l’appel API

      Au cours de cette étape, vous allez mettre en place un appel API et envoyer les données des Droplets comme contexte au modèle à afficher dans un tableau.

      Obtenir des données de Droplets

      Revenez au répertoire de l’app display_droplets

      Installez la bibliothèque de requêtes afin que vous puissiez parler à l’API :

      La bibliothèque de requêtes permet à votre code de demander des données aux API et d’ajouter des en-têtes (données supplémentaires envoyées avec notre requête).

      Maintenant, vous allez créer un fichier services.py, dans lequel vous effectuerez l’appel API. Cette fonction utilisera requests pour parler à https://api.digitalocean.com/v2/droplets et ajouter chaque Droplet du fichier JSON renvoyé à une liste.

      Ouvrez services.py pour le modifier :

      Ajoutez le code suivant au fichier :

      do_django_api/do_django_project/display_droplets/services.py

      import os
      import requests
      
      def get_droplets():
          url = 'https://api.digitalocean.com/v2/droplets'
          r = requests.get(url, headers={'Authorization':'Bearer %s' % 'access_token'})
          droplets = r.json()
          droplet_list = []
          for i in range(len(droplets['droplets'])):
              droplet_list.append(droplets['droplets'][i])
          return droplet_list
      

      Dans la fonction get_droplets, deux choses se produisent : une requête est faite et les données sont analysées. url contient l’URL demandant les données des Droplets de l’API DigitalOcean. r stocke les données demandées.

      requests a deux paramètres dans ce cas : url et headers. Si vous voulez des données provenant d’une API différente, vous devez remplacer la valeur url par l’URL appropriée. headers envoie à DigitalOcean votre jeton d’accès, afin qu’il sache que vous êtes autorisé à faire la demande et pour quel compte la demande est effectuée.

      droplets contient les informations de la variable r, mais maintenant elle a été convertie à partir de JSON (format dans lequel l’API envoie des informations), dans un dictionnaire facile à utiliser au sein d’une boucle for.

      Les trois lignes suivantes créent un tableau,droplet_list[]. Ensuite, une boucle for itère les informations en droplets et ajoute chaque élément à la liste. Toutes les informations extraites de l’API et stockées dans les droplets peuvent être trouvées dans les Developer Docs de DigitalOcean.

      Remarque : n’oubliez pas de remplacer access_token par votre jeton d’accès. En outre, conservez-le et ne publiez jamais ce jeton en ligne.

      Enregistrez et fermez le fichier.

      Protéger votre jeton d’accès

      Vous devez toujours cacher votre jeton d’accès, mais au cas où quelqu’un voudrait exécuter votre projet, vous devez disposer d’un moyen facile pour qu’il puisse ajouter son propre jeton d’accès sans avoir à modifier le code Python. DotENV est la solution, car les variables sont conservées dans un fichier .env qui peut être facilement modifié.

      Revenez au répertoire do_django_project :

      Pour commencer à travailler avec des variables d’environnement, installez python-dotenv :

      • pip install python-dotenv

      Une fois qu’il est installé, vous devez configurer Django pour gérer les variables d’environnement, afin de pouvoir les référencer dans le code. Pour ce faire, vous devez ajouter quelques lignes de code à manage.py et à wsgi.py.

      Ouvrez manage.py pour le modifier :

      Ajoutez le code suivant :

      do_django_api/do_django_project/manage.py

      
      """Django's command-line utility for administrative tasks."""
      import os
      import sys
      import dotenv
      
      def main():
          os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'do_django_project.settings')
          try:
              from django.core.management import execute_from_command_line
          except ImportError as exc:
              raise ImportError(
                  "Couldn't import Django. Are you sure it's installed and "
                  "available on your PYTHONPATH environment variable? Did you "
                  "forget to activate a virtual environment?"
              ) from exc
          execute_from_command_line(sys.argv)
      
      if __name__ == '__main__':
          main()
      
      dotenv.load_dotenv(
          os.path.join(os.path.dirname(__file__), '.env')
      )
      

      L’ajout de ceci dans manage.py signifie que lorsque vous envoyez des commandes à Django en cours de développement, il gère les variables d’environnement de votre fichier .env.

      Enregistrez et fermez le fichier.

      Si jamais vous avez de besoin de gérer des variables d’environnement dans vos projets de production, vous pouvez le faire à partir du fichier wsgi.py. Passez au répertoire do_django_project :

      Et ouvrez wsgi.py pour le modifier :

      Ajoutez le code suivant à wsgi.py :

      do_django_api/do_django_project/do_django_project/wsgi.py

      
      import os
      import dotenv
      
      from django.core.wsgi import get_wsgi_application
      
      os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'do_django_project.settings')
      
      dotenv.load_dotenv(
          os.path.join(os.path.dirname(os.path.dirname(__file__)), '.env')
      )
      
      application = get_wsgi_application()
      

      Ce fragment de code a un os.path.dirname() supplémentaire parce que wsgi.py doit remonter deux répertoires pour trouver le fichier .env. Ce fragment n’est pas le même que celui utilisé pour manage.py.

      Enregistrez et fermez le fichier.

      Vous pouvez maintenant utiliser une variable d’environnement dans services.py au lieu de votre jeton d’accès. Revenez au répertoire display_droplets​​​​ :

      • cd ..
      • cd display_droplets

      Ouvrez services.py pour le modifier :

      Maintenant, remplacez votre jeton d’accès par une variable d’environnement :

      do_django_api/display_droplets/services.py

      import os
      import requests
      
      def get_droplets():
          url = "https://api.digitalocean.com/v2/droplets"
          r = requests.get(url, headers={'Authorization':'Bearer %s' % os.getenv('DO_ACCESS_TOKEN')})
          droplets = r.json()
          droplet_list = []
          for i in range(len(droplets['droplets'])):
              droplet_list.append(droplets['droplets'][i])
          return droplet_list
      

      Enregistrez et fermez le fichier.

      L’étape suivante consiste à créer un fichier .env. Revenez au répertoire do_django_project :

      Créez un fichier .env et gardez le ouvert le fichier pour le modifier :

      Dans .env, ajoutez votre jeton en tant que variable DO_ACCESS_TOKEN

      do_django_api/do_django_project/.env

      DO_ACCESS_TOKEN=access_token
      

      Enregistrez et fermez le fichier.

      Remarque : ajoutez .env à votre fichier .gitignore afin qu’il ne soit jamais inclus dans vos validations.

      La connexion API est maintenant installée et configurée, et vous avez également protégé votre jeton d’accès. Il est temps de présenter à l’utilisateur les informations que vous avez récupérées.

      Étape 4 – Traitement des données de droplets dans Vues et Modèles

      Maintenant que vous savez faire des appels API, vous devez envoyer les données des Droplets au modèle, pour le rendu. Revenons au fragment de la fonction, GetDroplets, que vous avez créé plus tôt dans views.py. Dans la fonction, vous enverrez droplet_list comme contexte au modèle droplets.html.

      Passez au répertoire display_droplets :

      Ouvrez views.py pour le modifier :

      Ajoutez le code suivant à views.py :

      do_django_api/do_django_project/display_droplets/views.py

      from django.shortcuts import render
      from django.views.generic import TemplateView
      from .services import get_droplets
      
      class GetDroplets(TemplateView):
          template_name = 'droplets.html'
          def get_context_data(self, *args, **kwargs):
              context = {
                  'droplets' : get_droplets(),
              }
              return context
      

      Les informations envoyées au modèle droplets.html sont traitées via le dictionnaire context. C’est pourquoi droplets agit comme une clé et le tableau renvoyé à partir de get_droplets() agit comme une valeur.

      Enregistrez et fermez le fichier.

      Présenter les données dans le modèle

      Dans le modèle droplets.html, vous allez créer un tableau et le remplir avec les données des droplets.

      Passez au répertoire templates :

      Ouvrez droplets.html pour le modifier :

      Ajoutez le code suivant après l’élément nav dans droplets.html :

      do_django_api/do_django_project/display_droplets/templates/droplets.html

      <table class="table is-fullwidth is-striped is-bordered">
          <thead>
          <tr>
              <th>Name</th>
              <th>IPv4 Address(es)</th>
              <th>Id</th>
              <th>Region</th>
              <th>Memory</th>
              <th>CPUs</th>
              <th>Disk Size</th>
          </tr>
          </thead>
          <tbody>
          {% for droplet in droplets %}
          <tr>
              <th>{{ droplet.name }}</th>
              {% for ip in droplet.networks.v4 %}
              <td>{{ ip.ip_address }}</td>
              {% endfor %}
              <td>{{ droplet.id }}</td>
              <td>{{ droplet.region.name }}</td>
              <td>{{ droplet.memory }}</td>
              <td>{{ droplet.vcpus }}</td>
              <td>{{ droplet.disk }}</td>
          </tr>
          {% endfor %}
          </tbody>
      </table>
      

      {% for droplet in droplets %} ... {% end for %} est une boucle qui itére à travers le tableau de Droplets récupéré dans views.py. Chaque droplet est inséré dans une rangée de table. Les différentes lignes {{ droplet.<attribut> }} récupèrent cet attribut pour chaque Droplet de la boucle, et l’insèrent dans une cellule de la table.

      Enregistrez et fermez le fichier.

      Actualisez votre navigateur et vous verrez une liste de Droplets.

      Modèle avec tableau de données droplet

      Vous pouvez maintenant gérer l’API DigitalOcean dans vos projets Django. Vous avez pris les données extraites de l’API et les avez insérées dans le modèle que vous avez créé précédemment, pour afficher les informations de manière lisible et souple.

      Conclusion

      Dans cet article, vous avez construit un projet Django qui peut afficher les informations de Droplets à partir de l’API DigitalOcean avec un style Bulma CSS. Vous avez acquis trois compétences importantes en suivant ce tutoriel :

      • Comment gérer les requêtes API en Python en utilisant les modules requests et json.
      • Comment afficher des données API dans un projet Django en utilisant les logiques view et template.
      • Comment manipuler en toute sécurité vos jetons d’API en utilisant dotenv dans Django.

      Maintenant que vous avez été initié à la manipulation des API dans Django, vous pouvez créer votre propre projet en utilisant soit une autre fonctionnalité de l’API DigitalOcean, soit une toute autre API. Vous pouvez également consulter d’autres tutoriels Django, ou un tutoriel similaire avec le cadre React.





      Source link