flask api tutorial with example extending flask with apis
Ce didacticiel Flask API explique les extensions Flask populaires telles que Flask twitter Oembedder, Flask API et Flask RESTful avec des exemples:
Le framework Flask a un nombre assez abondant d'extensions. Ces extensions sont très utiles et faciles à développer. Nous savons que le framework Flask est très pythonique et dispose d'un ensemble minimal d'API, et est très flexible, c'est pourquoi la communauté Flask a créé autant d'extensions pour de nombreuses tâches spécifiques.
Dans le cadre de la série de didacticiels Flask, ce didacticiel présente un exemple de quelques extensions Flask. Nous discuterons des extensions suivantes.
- Flacon Twitter Oembedder
- API Flask
- Flacon RESTful
=> Visitez ici pour apprendre Flask From Scratch
Bien que nous ayons discuté de nombreuses extensions dans le cadre de nos tutoriels précédents, ce tutoriel explique plus en détail dans la perspective de l'examen des composants d'une extension Flask.
Ce que vous apprendrez:
Qu'est-ce qu'une extension Flask
Une extension flask est un module Python installable ou un package qui implémente des fonctionnalités supplémentaires dans une application Flask. Une extension Flask peut être aussi simple que celle qui ajoute la prise en charge de la consommation d'une API externe telle que Twitter pour intégrer un tweet sur une page Web.
Ou, une extension Flask peut être un nouveau framework tel que Flask API ou Flask-RESTful pour créer des applications qui suivent un modèle architectural ou un paradigme de développement.
Flacon Twitter Oembedder
Dans cette section, nous prenons l'exemple d'un projet simple open-source existant de Ici
Clonez ce projet sur votre machine locale et installez-le à l'aide de pip à l'aide de la commande mentionnée ci-dessous.
# in an activated virtual environment pip install -e flask_twitter_oembedder/
Cette extension aide à intégrer un Tweet à l'aide d'une balise de modèle Jinja2. Cependant, pour utiliser cette extension, vous devrez demander un compte développeur sur Twitter. Une fois que vous avez obtenu un compte de développeur, créez une application et vous obtiendrez des clés et des secrets pour utiliser l'API de Twitter.
générateur de nombres aléatoires c ++ entre deux nombres
Une fois que vous avez les clés et les secrets, stockez-les dans un endroit sûr afin que l'application puisse y accéder. Nous les avons conservés dans les variables d'environnement et les avons ajoutés à la configuration de l'application Flask, comme indiqué ci-dessous. Notre application de démonstration conserve les valeurs de configuration dans le fichier config.py.
# Twitter details import os TWITTER_ACCESS_TOKEN = os.environ.get('TWITTER_ACCESS_TOKEN', None) TWITTER_TOKEN_SECRET = os.environ.get('TWITTER_TOKEN_SECRET', None) TWITTER_CONSUMER_KEY = os.environ.get('TWITTER_CONSUMER_KEY', None) TWITTER_CONSUMER_SECRET = os.environ.get('TWITTER_CONSUMER_SECRET', None)
Nous obtenons les valeurs des variables requises à partir des variables d'environnement. Si la valeur correspondante n'est pas présente dans la variable d'environnement, celle-ci est stockée comme None.
Une fois que vous avez ajouté les lignes ci-dessus dans le fichier de configuration, accédez au __init__.py de l'application Flask et initialisez-le en le modifiant, comme indiqué ci-dessous.
from flask_caching import Cache from flask_twitter_oembedder import TwitterOEmbedder cache = Cache(app, config={'CACHE_TYPE': 'simple'}) twitter_oembedder = TwitterOEmbedder(app, cache)
Ces lignes initialiseront l'extension Flask. Maintenant, nous pouvons modifier hello.html sous les modèles et ajouter la balise mentionnée ci-dessous comme indiqué ci-dessous.
{{ oembed_tweet('1277228221394587649') }}
Nous avons ajouté cette balise avant la boucle for dans le modèle existant. Ce très long chiffre est l'identifiant du tweet. Nous obtenons cet identifiant à partir de l'URL du Tweet après le tweet. Après avoir enregistré le fichier de modèle, nous naviguons vers le point de terminaison / hello / greetings et recevons les résultats, comme indiqué dans l'image ci-dessous.
Flacon RESTful
Notre exemple d'application Flask RESTful est celui qui respecte les contraintes de l'architecture REST. Cependant, ce n'est pas comme un protocole, et les développeurs sont flexibles lors de l'implémentation des fonctionnalités, en suivant les contraintes REST.
Veuillez en savoir plus sur les contraintes de l'architecture REST Ici .
Les applications Web modernes permettent aux clients de demander les ressources à des points de terminaison faciles à lire et stables de manière sans état.
Exemple de flacon RESTful
Implémentons également certaines fonctionnalités de manière RESTful dans notre exemple d'application Flask RESTful.
Nous avons un moyen de stocker et de diffuser des données liées aux albums et aux chansons. Implémentons une API à l'aide de l'extension Flask RESTful.
Tout d'abord, installez Flask RESTful à l'aide de la commande ci-dessous.
pip install flask-restful
Pour faciliter la maintenance et la compréhension, créons un fichier appelé api.py dans le répertoire de l'application et mentionnons les lignes de code suivantes. Pour l'instant, envisagez des API similaires aux vues Flask.
Nous allons implémenter des fonctionnalités correspondant aux verbes HTTP pour répondre lorsque le Client envoie une requête au point de terminaison Serveur de l'application.
from flask import request from flask_restful import Resource, reqparse, abort, Api from . import app api = Api(app, prefix='/myapi/v1') def abort_if_song_doesnt_exist(song_name): if song_name not in SONGS: abort(404, message='Song {} doesn't exist'.format(song_name)) parser = reqparse.RequestParser() parser.add_argument('title') parser.add_argument('singer') SONGS = { 'Song1': { 'title': 'Past Life', 'singer': 'Selena Gomez' } } class Songs(Resource): def get(self): return {'songs': SONGS} def post(self): args = parser.parse_args(strict=True) song_name = int(max(SONGS.keys()).lstrip('Song')) + 1 song_name = 'Song%d' % song_name SONGS[song_name] = {'title': args['title'], 'singer': args['singer']} return { song_name:SONGS[song_name] }, 201 api.add_resource(Songs, '/songs') class Song(Resource): def get(self, song_name): abort_if_song_doesnt_exist(song_name) return { song_name: SONGS[song_name] } def delete(self, song_name): abort_if_song_doesnt_exist(song_name) del SONGS[song_name] return '', 204 def put(self, song_name): args = parser.parse_args(strict=True) abort_if_song_doesnt_exist(song_name) SONGS[song_name] = {'title': args['title'], 'singer': args['singer']} return { song_name: SONGS[song_name] }, 201 api.add_resource(Song, '/songs/')
Nous avons créé deux ressources appelées Songs et Song en sous-classant la classe abstraite Resource de Flask-RESTful. La classe appelée Songs a deux méthodes get et post correspondant aux deux verbes HTTP; GET et POST, respectivement.
La ressource Morceaux sert tous les morceaux au point de terminaison enregistré lorsque le client le demande et ajoute un morceau à la liste des morceaux existants lorsque les données sont publiées au même point de terminaison.
De même, dans le cas de la classe Song, HTTP GET, DELETE et PUT sont implémentés à l'aide des méthodes get, delete et put. La méthode get envoie une réponse avec la chanson demandée au format JSON, la méthode delete supprime une chanson de SONGS et la méthode put met à jour une chanson existante dans SONGS.
Ajoutons maintenant ces ressources à notre exemple d'application en les initialisant dans le fichier __init__.py sous le dossier de l'application.
from . import api
Installons curl et essayons les fonctionnalités sur les points de terminaison indiqués.
meilleur bloqueur de publicités pop-up pour chrome
sudo apt -y install curl
Obtenez toutes les chansons
curl -k https://localhost:8080/api/v1/songs
Nous obtenons la réponse, comme indiqué ci-dessous.
{ 'songs': { 'Song1': { 'title': 'Past Life', 'singer': 'Selena Gomez' } } }
Utilisons maintenant la commande mentionnée ci-dessous pour ajouter une chanson.
curl -k -d 'title=Summer Days&singer=Martin Garrix' https://localhost:8080/api/v1/songs
Nous obtenons la réponse de notre API, comme indiqué ci-dessous.
{ 'Song2': { 'title': 'Summer Days', 'singer': 'Martin Garrix2' } }
Encore une fois, si nous interrogeons la liste des chansons comme nous l'avons fait dans la commande précédente, nous obtiendrons les deux chansons dans la réponse.
{ 'songs': { 'Song1': { 'title': 'Past Life', 'singer': 'Selena Gomez' }, 'Song2': { 'title': 'Summer Days', 'singer': 'Martin Garrix2' } } }
De même, HTTP DELETE et PUT fonctionnent comme prévu. Ajoutons quelques tests pour la version v1 de cette API simple que nous avons créée.
def test_myapi_v1_songs(client): resp = client.get('/api/v1/songs/') #import pdb;pdb.set_trace() assert 200 == resp.status_code def test_myapi_v1_add_song(client): ''' The application can store the same data multiple times''' data = { 'title': 'Summer Days', 'singer': 'Martin Garrix' } resp = client.post( '/api/v1/songs/', data=data ) assert 201 == resp.status_code
Exécutez maintenant ces tests à partir de la ligne de commande, comme indiqué ci-dessous.
pytest app/tests/test_api.py
De même, nous pouvons écrire des tests pour d'autres méthodes pour plus de couverture.
Une chose importante à noter est que les chansons que nous avons ajoutées persistent dans le cadre du processus unique sous lequel le serveur de développement s'exécute. Cela signifie que toutes les nouvelles données seront perdues dès l'arrêt du processus.
De plus, la tâche de création de la version v1 de l'API semble redondante, et elle est différente de la façon dont nous sauvegardions les données dans l'application à l'aide de formulaires et de vues.
Habituellement, l'implémentation de l'API RESTful nécessite l'obtention de données des clients, le marshaling entre les extrémités client et serveur et la persistance à l'aide des modèles de base de données que nous avons créés.
De plus, les points de terminaison sont sécurisés pour les entrées involontaires et conçues.
Par conséquent, nous recommandons que les exemples ci-dessus ne servent qu'à apprendre les concepts et les contraintes de l'architecture REST à l'aide des méthodes HTTP. N'oubliez pas que ce n'est qu'une des nombreuses façons de créer des services Web. De plus, l'architecture REST peut être implémentée de nombreuses manières.
Nous encourageons les lecteurs à explorer plus avant comment REST peut avoir différents formats de fichiers et méthodes personnalisées en utilisant d'autres protocoles et pas seulement JSON et HTTP. Juste pour donner un aperçu d'une utilisation en production, nous fournissons l'exemple ci-dessous.
Nous utilisons une BaseApi Flask-Appbuilder pour implémenter des fonctionnalités similaires sous différents points de terminaison. Ouvrez le fichier api.py et mettez-le à jour avec le code mentionné ci-dessous.
APIs using appbuilder from flask_appbuilder.api import BaseApi, expose from . import appbuilder class SongsApi(BaseApi): resource_name = 'songs' @expose('/', methods=['POST', 'GET']) def songs(self): if request.method == 'GET': return self.response(200, songs=SONGS) else: args = parser.parse_args(strict=True) song_name = int(max(SONGS.keys()).lstrip('Song')) + 1 song_name = 'Song%d' % song_name SONGS[song_name] = {'title': args['title'], 'singer': args['singer']} return self.response(201, song=SONGS[song_name]) appbuilder.add_api(SongsApi) class SongApi(BaseApi): resource_name = 'songs' @expose('/', methods=['GET', 'DELETE', 'PUT']) def song(self, song_name): if request.method == 'GET': abort_if_song_doesnt_exist(song_name) return self.response(200, song_name=SONGS[song_name] ) elif request.method == 'DELETE': abort_if_song_doesnt_exist(song_name) del SONGS[song_name] return self.response(204, message='OK') elif request.method == 'PUT': args = parser.parse_args(strict=True) abort_if_song_doesnt_exist(song_name) SONGS[song_name] = {'title': args['title'], 'singer': args['singer']} return self.response(201, song_name=SONGS[song_name]) else: self.response_404() appbuilder.add_api(SongApi)
Ajoutons maintenant d'autres tests pour tester les points de terminaison créés à l'aide de Flask-Appbuilder. Nous exécuterons ces tests en utilisant PyTest.
def test_v1_songs(client): resp = client.get('/api/v1/songs/', follow_redirects=True) #import pdb;pdb.set_trace() assert 200 == resp.status_code def test_v1_add_song(client): ''' The application can store the same data multiple times''' # Get the existing number of songs resp = client.get('/api/v1/songs/', follow_redirects=True) data = { 'title': 'Summer Days', 'singer': 'Martin Garrix' } resp = client.post( '/api/v1/songs/', data=data, follow_redirects=True ) assert 201 == resp.status_code
Flask-Appbuilder aide également à fournir l'interface utilisateur Swagger pour répertorier et essayer l'API publiée. Ouvrez config.py et mettez-le à jour avec la configuration ci-dessous.
FAB_API_SWAGGER_UI=True
Accédez maintenant à https: // localhost: 8080 / swaggerview / v1 et vous pourrez voir la vue Swagger comme indiqué ci-dessous.
Créons maintenant des API pour les modèles de base de données existants dont nous disposons. Nous devons utiliser le ModelApi de Flask-Appbuilder.
Mettez à jour le fichier api.py avec les lignes de code suivantes.
from flask_appbuilder.models.sqla.interface import SQLAInterface from flask_appbuilder.api import ModelRestApi from .models import Song as SongModel class MySongModelApi(ModelRestApi): resource_name = 'newsongs' datamodel = SQLAInterface(SongModel) appbuilder.add_api(MySongModelApi)
Après avoir défini une classe basée sur ModelRestApi, nous devons à nouveau l'enregistrer avec Flask-Appbuilder en utilisant la méthode add_api.
Accédez maintenant à l'interface utilisateur de Swagger comme précédemment, et vous verrez une référence d'API similaire à celle illustrée ci-dessous.
Vous pouvez essayer l'API à partir de la vue Swagger ou en envoyant la boucle aux points de terminaison comme précédemment.
API Flask
L'API Flask est un framework assez similaire au framework Django REST. Vous pouvez accéder à la documentation de l'API Flask Ici . C'est le remplacement instantané du framework Flask.
Nous pouvons choisir l'un des exemples ci-dessus pour implémenter les fonctionnalités pilotées par l'API Flask REST dans notre application.
Maintenant, validons la source et publions les modifications dans le dépôt d'origine à l'aide de Git. Dès que nous nous engageons sur l'origine avec le nom de la branche et que nous envoyons une pull request, les tests unitaires se déclencheront automatiquement sous les actions Git dans le cadre des vérifications de pull request.
Bouteille RestPlus
Flask RestPlus est une autre extension Flask qui aide à la création de l'API REST à l'aide de Flask. Ce projet a été fusionné dans une autre extension appelée Flask-RESTX et n'est plus maintenu.
Ce projet a une bonne collection de décorateurs pour décrire les API et expose sa documentation à l'aide de Swagger. Vous pouvez vérifier les détails de ce projet Ici .
Questions fréquemment posées
Q # 1) Comment créer une API REST avec Flask?
Répondre: Nous pouvons utiliser le framework Flask avec d'autres extensions Flask telles que Flask-RESTful, Flask API, Flask RESTX, Connexion, etc. pour créer des applications Web basées sur l'API REST. La plupart des extensions fonctionnent avec les autres fonctionnalités intégrées du framework Flask et tout autre ORM / bibliothèques existantes.
Q # 2) Qu'est-ce qu'un exemple d'API REST?
Répondre: Un exemple d'application qui implémente l'API RESTFul est donné dans ce didacticiel. Flask-RESTful a été utilisé pour créer l'exemple d'application. Découvrez la section d'exemple Flask RESTful dans ce didacticiel.
Q # 3) À quoi sert l'API RESTful?
Répondre: Une interface de programmation d'application qui utilise généralement des requêtes HTTP et a des méthodes de backend correspondantes pour les verbes HTTP tels que GET, POST, PUT, etc. pour permettre la communication entre le client et le serveur est appelée une API RESTful.
Questions d'entretien SQL pour 3 ans d'expérience
Une telle application suit les principes et les contraintes de l'architecture REST pour implémenter ses fonctionnalités.
Conclusion
Nous avons couvert les concepts des extensions Flask à l'aide de trois extensions, telles que Flask-twitter-oembedder, Flask API et Flask-RESTful.
Avec l'aide de Flask-twitter-oembedder, nous avons également couvert les concepts de l'API Twitter. En général, nous avons également inclus les idées d'implémentation d'un service Web RESTful, qui suit les principes et les contraintes de l'architecture REST.
Dans notre prochain tutoriel, nous couvrirons la comparaison entre les frameworks Django et Flask pour aider nos lecteurs à comprendre les forces et les faiblesses des deux frameworks. Cela aidera également à choisir un cadre par rapport à l'autre en fonction des exigences particulières du projet.
=> Découvrez la série de formation Simple Flask ici
lecture recommandée
- Tutoriel de test d'API: un guide complet pour les débutants
- Tutoriel de l'API Rest: architecture et contraintes de l'API REST
- Tutoriel Parasoft SOAtest: outil de test d'API sans script
- Comment créer une documentation API dans Postman?
- Tutoriel sur l'API REST GitHub - Prise en charge de l'API REST dans GitHub
- Comment utiliser Postman pour tester différents formats d'API?
- Tutoriel POSTMAN: Test d'API avec POSTMAN
- Top 31 des questions d'entrevue Python Flask populaires avec réponses