Ecrire une API en Python (avec Flask et RapidAPI)

Ecrire une API en Python (avec Flask et RapidAPI)

Si vous lisez cet article, vous êtes probablement déjà familiarisé avec les possibilités qui s'ouvrent lors de l'utilisation de l'API (Application Programming Interface).

En ajoutant l'une des nombreuses API publiques à votre application, vous pouvez étendre les fonctionnalités de cette application ou la compléter avec les données nécessaires. Mais que se passe-t-il si vous avez développé une fonctionnalité unique que vous souhaitez partager avec la communauté ?

La réponse est simple : vous avez besoin créez votre propre API.

Bien que cela puisse sembler une tâche ardue au début, c'est en fait assez simple. Nous allons vous montrer comment faire cela avec Python.

Ce dont vous avez besoin pour commencer

Le développement d'API nécessite :

  • Python 3 ;
  • Flacon — un cadre simple et facile à utiliser pour créer des applications Web ;
  • Flacon-RESTful est une extension pour Flask qui vous permet de développer une API REST rapidement et avec une configuration minimale.

L'installation s'effectue par la commande :

pip install flask-restful

Nous recommandons une programmation intensive gratuite pour les débutants :
Développement de robots Telegram en C# — 26-28 août. Un cours intensif gratuit qui vous permet de comprendre le fonctionnement des robots d'assistance, les fonctionnalités de travail avec l'API Telegram et d'autres nuances. Les trois meilleurs participants recevront 30 000 roubles de Skillbox.

Avant de commencer

Nous allons développer une API RESTful avec une base Fonctionnalité CRUID.

Pour bien comprendre la tâche, comprenons les deux termes mentionnés ci-dessus.

Qu'est-ce que le REPOS ?

L'API REST (Representational State Transfer) est une API qui utilise des requêtes HTTP pour échanger des données.

Les API REST doivent répondre à certains critères :

  • Architecture client-serveur : le client interagit avec l'interface utilisateur et le serveur interagit avec le backend et le magasin de données. Le client et le serveur sont indépendants, chacun d'eux peut être remplacé séparément de l'autre.
  • Sans état - Aucune donnée client n'est stockée sur le serveur. L'état de la session est stocké côté client.
  • Cacheability - Les clients peuvent mettre en cache les réponses du serveur pour améliorer les performances globales.

Qu'est-ce que CRUD ?

Cru est un concept de programmation qui décrit quatre actions de base (créer, lire, mettre à jour et supprimer).

Dans l'API REST, les types de requête et les méthodes de requête sont responsables d'actions telles que publier, obtenir, mettre, supprimer.

Maintenant que nous avons traité les termes de base, nous pouvons commencer à créer l'API.

Développement

Créons un référentiel de citations sur l'intelligence artificielle. L'IA est l'une des technologies à la croissance la plus rapide aujourd'hui, et Python est un outil populaire pour travailler avec l'IA.

Avec cette API, un développeur Python peut rapidement se familiariser avec l'IA et s'inspirer de nouvelles réalisations. Si le développeur a des idées intéressantes sur ce sujet, il pourra les ajouter au référentiel.

Commençons par importer les modules requis et configurons Flask :

from flask import Flask
from flask_restful import Api, Resource, reqparse
import random
app = Flask(__name__)
api = Api(app)

Dans cet extrait, Flask, Api et Resource sont les classes dont nous avons besoin.

Reqparse est une interface d'analyse de requête Flask-RESTful... Vous aurez également besoin du module random pour afficher une citation aléatoire.

Nous allons maintenant créer un référentiel de citations sur l'IA.

Chaque entrée de dépôt contiendra :

  • identification numérique ;
  • le nom de l'auteur de la citation;
  • citation.

Comme il ne s'agit que d'un exemple d'apprentissage, nous allons stocker toutes les entrées dans une liste Python. Dans une application réelle, nous utiliserions très probablement une base de données à la place.

ai_quotes = [
    {
        "id": 0,
        "author": "Kevin Kelly",
        "quote": "The business plans of the next 10,000 startups are easy to forecast: " +
                 "Take X and add AI."
    },
    {
        "id": 1,
        "author": "Stephen Hawking",
        "quote": "The development of full artificial intelligence could " +
                 "spell the end of the human race… " +
                 "It would take off on its own, and re-design " +
                 "itself at an ever increasing rate. " +
                 "Humans, who are limited by slow biological evolution, " +
                 "couldn't compete, and would be superseded."
    },
    {
        "id": 2,
        "author": "Claude Shannon",
        "quote": "I visualize a time when we will be to robots what " +
                 "dogs are to humans, " +
                 "and I’m rooting for the machines."
    },
    {
        "id": 3,
        "author": "Elon Musk",
        "quote": "The pace of progress in artificial intelligence " +
                 "(I’m not referring to narrow AI) " +
                 "is incredibly fast. Unless you have direct " +
                 "exposure to groups like Deepmind, " +
                 "you have no idea how fast — it is growing " +
                 "at a pace close to exponential. " +
                 "The risk of something seriously dangerous " +
                 "happening is in the five-year timeframe." +
                 "10 years at most."
    },
    {
        "id": 4,
        "author": "Geoffrey Hinton",
        "quote": "I have always been convinced that the only way " +
                 "to get artificial intelligence to work " +
                 "is to do the computation in a way similar to the human brain. " +
                 "That is the goal I have been pursuing. We are making progress, " +
                 "though we still have lots to learn about " +
                 "how the brain actually works."
    },
    {
        "id": 5,
        "author": "Pedro Domingos",
        "quote": "People worry that computers will " +
                 "get too smart and take over the world, " +
                 "but the real problem is that they're too stupid " +
                 "and they've already taken over the world."
    },
    {
        "id": 6,
        "author": "Alan Turing",
        "quote": "It seems probable that once the machine thinking " +
                 "method had started, it would not take long " +
                 "to outstrip our feeble powers… " +
                 "They would be able to converse " +
                 "with each other to sharpen their wits. " +
                 "At some stage therefore, we should " +
                 "have to expect the machines to take control."
    },
    {
        "id": 7,
        "author": "Ray Kurzweil",
        "quote": "Artificial intelligence will reach " +
                 "human levels by around 2029. " +
                 "Follow that out further to, say, 2045, " +
                 "we will have multiplied the intelligence, " +
                 "the human biological machine intelligence " +
                 "of our civilization a billion-fold."
    },
    {
        "id": 8,
        "author": "Sebastian Thrun",
        "quote": "Nobody phrases it this way, but I think " +
                 "that artificial intelligence " +
                 "is almost a humanities discipline. It's really an attempt " +
                 "to understand human intelligence and human cognition."
    },
    {
        "id": 9,
        "author": "Andrew Ng",
        "quote": "We're making this analogy that AI is the new electricity." +
                 "Electricity transformed industries: agriculture, " +
                 "transportation, communication, manufacturing."
    }
]

Nous devons maintenant créer une classe de ressources Quote qui définira les opérations de nos points de terminaison API. Quatre méthodes doivent être déclarées à l'intérieur de la classe : get, post, put, delete.

Commençons par la méthode GET

Il permet d'obtenir un devis spécifique en spécifiant son identifiant, ou un devis aléatoire si aucun identifiant n'est spécifié.

class Quote(Resource):
    def get(self, id=0):
        if id == 0:
            return random.choice(ai_quotes), 200
        for quote in ai_quotes:
            if(quote["id"] == id):
                return quote, 200
        return "Quote not found", 404

La méthode GET renvoie une citation aléatoire si l'ID contient la valeur par défaut, c'est-à-dire lors de l'appel de la méthode, l'ID n'a pas été défini.

S'il est défini, la méthode recherche parmi les guillemets et trouve celui qui contient l'ID donné. Si rien n'est trouvé, le message « Quote not found, 404 » s'affiche.

N'oubliez pas que la méthode renvoie un statut HTTP de 200 si la requête a réussi et de 404 si l'entrée n'a pas été trouvée.

Créons maintenant une méthode POST pour ajouter un nouveau devis au référentiel

Il obtiendra l'identifiant de chaque nouvelle citation au fur et à mesure que vous tapez. De plus, POST utilisera reqparse pour analyser les paramètres qui iront dans le corps de la requête (texte de l'auteur et de la citation).

def post(self, id):
      parser = reqparse.RequestParser()
      parser.add_argument("author")
      parser.add_argument("quote")
      params = parser.parse_args()
      for quote in ai_quotes:
          if(id == quote["id"]):
              return f"Quote with id {id} already exists", 400
      quote = {
          "id": int(id),
          "author": params["author"],
          "quote": params["quote"]
      }
      ai_quotes.append(quote)
      return quote, 201

Dans le code ci-dessus, la méthode POST acceptait un ID de devis. Ensuite, à l'aide de reqparse, il a récupéré l'auteur et la citation de la requête, en les stockant dans le dictionnaire params.

Si un devis avec l'ID spécifié existe déjà, la méthode affiche le message et le code 400 appropriés.

Si une citation avec l'ID spécifié n'a pas encore été créée, la méthode crée une nouvelle entrée avec l'ID et l'auteur spécifiés, ainsi que d'autres paramètres. Il ajoute ensuite une entrée à la liste ai_quotes et renvoie une entrée avec une nouvelle citation ainsi qu'un code 201.

Nous créons maintenant une méthode PUT pour modifier un devis existant dans le référentiel

def put(self, id):
      parser = reqparse.RequestParser()
      parser.add_argument("author")
      parser.add_argument("quote")
      params = parser.parse_args()
      for quote in ai_quotes:
          if(id == quote["id"]):
              quote["author"] = params["author"]
              quote["quote"] = params["quote"]
              return quote, 200
      
      quote = {
          "id": id,
          "author": params["author"],
          "quote": params["quote"]
      }
      
      ai_quotes.append(quote)
      return quote, 201

La méthode PUT, similaire à l'exemple précédent, prend un ID et une entrée et analyse les paramètres de citation à l'aide de reqparse.

Si un devis avec l'ID spécifié existe, la méthode le mettra à jour avec les nouveaux paramètres, puis sortira le devis mis à jour avec le code 200. S'il n'y a pas encore de devis avec l'ID spécifié, un nouvel enregistrement avec le code 201 sera créé.

Enfin, créons une méthode DELETE pour supprimer une citation qui n'est plus inspirante.

def delete(self, id):
      global ai_quotes
      ai_quotes = [qoute for qoute in ai_quotes if qoute["id"] != id]
      return f"Quote with id {id} is deleted.", 200

Cette méthode prend l'ID de devis en entrée et met à jour la liste des ai_quotes à l'aide de la liste partagée.

Maintenant que nous avons créé toutes les méthodes, il ne nous reste plus qu'à ajouter la ressource à l'API, à définir le chemin et à exécuter Flask.

api.add_resource(Quote, "/ai-quotes", "/ai-quotes/", "/ai-quotes/<int:id>")
if __name__ == '__main__':
    app.run(debug=True)

Notre service API REST est prêt !

Ensuite, nous pouvons enregistrer le code dans le fichier app.py en l'exécutant dans la console avec la commande :

python3 app.py

Si tout va bien, nous obtiendrons quelque chose comme ceci :

* Mode débogage : activé
* Fonctionne sur 127.0.0.1:5000/ (Appuyez sur CTRL+C pour quitter)
* Redémarrage avec stat
* Le débogueur est actif !
* PIN du débogueur : XXXXXXX

Tester l'API

Une fois l'API créée, elle doit être testée.

Cela peut être fait à l'aide de l'utilitaire de console curl ou du client Insomnia REST, ou en publiant l'API sur l'API Rapid.

Ecrire une API en Python (avec Flask et RapidAPI)

Publication de notre API

RapidAPI est la plus grande place de marché au monde avec plus de 10 000 API (et environ 1 million de développeurs).

RapidAPI fournit non seulement une interface unique pour travailler avec des API tierces, mais vous permet également de publier rapidement et facilement votre propre API.

À fais le, vous devez d'abord le publier sur un serveur du réseau. Dans notre cas, nous utiliserons Heroku. Travailler avec lui ne devrait poser aucune difficulté, (vous pouvez en savoir plus ici).

Comment publier votre API sur Heroku

1. Installez Heroku.

La première étape consiste à enregistrer et à installer l'interface de ligne de commande Heroku (CLI). Cela fonctionne sur Ubuntu 16+.

sudo snap installer heroku --classique

Ensuite on se connecte :

connexion Heroku

2. Ajoutez les fichiers nécessaires.

Nous devons maintenant ajouter les fichiers à publier dans un dossier de notre application :

  • requirements.txt avec une liste des modules Python requis ;
  • Procfile, qui spécifie quelles commandes doivent être exécutées pour exécuter l'application ;
  • .gitignore - pour exclure les fichiers qui ne sont pas nécessaires sur le serveur.

Le fichier requirements.txt contiendra les lignes suivantes :

  • ballon
  • ballon-repos
  • gunicorne

Veuillez noter que nous avons ajouté gunicorn (Python WSGI HTTP Server) à la liste car nous devons exécuter notre application sur le serveur.

Le profil contiendra :

web: application gunicorn: application

Contenu de .gitignore :

*.pyc
__pycache__/

Maintenant que les fichiers sont créés, initialisons le dépôt git et commitons :

git init
git add
git commit -m "First API commit"

3. Créez une nouvelle application Heroku.

heroku create

Pousser la branche principale vers le référentiel Heroku distant :

git push heroku master

Vous pouvez maintenant commencer par ouvrir le service API avec les commandes :

heroku ps:scale web=1
heroku open
 

L'API sera disponible sur votre-nom-heroku-aléatoire.herokuapp.com/ai-quotes.

Comment ajouter votre API Python au marché RapidAPI

Une fois le service API publié sur Heroku, vous pouvez l'ajouter à l'API Rapid. Ici documentation détaillée sur ce sujet.

1. Créez un compte RapidAPI.

Ecrire une API en Python (avec Flask et RapidAPI)

Nous enregistrons un compte gratuit - cela peut être fait en utilisant Facebook, Google, GitHub.

Ecrire une API en Python (avec Flask et RapidAPI)

2. Ajoutez l'API au panneau de contrôle.

Ecrire une API en Python (avec Flask et RapidAPI)

3. Ensuite, entrez les informations générales sur votre API.

Ecrire une API en Python (avec Flask et RapidAPI)

4. Après avoir cliqué sur "Ajouter une API", une nouvelle page apparaît où vous pouvez saisir des informations sur notre API.

Ecrire une API en Python (avec Flask et RapidAPI)

5. Vous pouvez maintenant saisir manuellement les points de terminaison de l'API ou télécharger fichier fanfaron à l'aide d'OpenAPI.

Ecrire une API en Python (avec Flask et RapidAPI)

Eh bien, vous devez maintenant définir les points de terminaison de notre API sur la page Points de terminaison. Dans notre cas, les endpoints correspondent au concept de CRUD (get, post, put, delete).

Ecrire une API en Python (avec Flask et RapidAPI)

Ensuite, vous devez créer un point de terminaison GET AI Quote qui affiche une citation aléatoire (si l'ID est par défaut) ou une citation pour l'ID spécifié.

Pour créer un point de terminaison, vous devez cliquer sur le bouton "Créer un point de terminaison".

Ecrire une API en Python (avec Flask et RapidAPI)

Nous répétons ce processus pour tous les autres points de terminaison d'API. C'est tout! Félicitations, vous avez publié votre API !

Si tout se passe bien, la page de l'API ressemblera à ceci :

Ecrire une API en Python (avec Flask et RapidAPI)

Conclusion

Dans cet article, nous avons parcouru le processus de création de notre propre service d'API RESTful en Python, ainsi que le processus de publication de l'API sur le cloud Heroku et de son ajout au répertoire RapidAPI.

Mais dans la version de test, seuls les principes de base du développement d'API ont été présentés - des nuances telles que la sécurité, la tolérance aux pannes et l'évolutivité n'ont pas été prises en compte.

Lors du développement d'une véritable API, tout cela doit être pris en compte.

Source: habr.com

Ajouter un commentaire