flask api tutorial with example extending flask with apis
In diesem Flask API-Tutorial werden beliebte Flask-Erweiterungen wie Flask Twitter Oembedder, Flask API und Flask RESTful anhand von Beispielen erläutert:
Das Flask-Framework verfügt über eine Vielzahl von Erweiterungen. Diese Erweiterungen sind sehr nützlich und einfach zu entwickeln. Wir wissen, dass das Flask-Framework sehr pythonisch ist, nur minimale APIs enthält und sehr flexibel ist, weshalb die Flask-Community so viele Erweiterungen für viele spezifische Aufgaben erstellt hat.
Als Teil der Flask-Tutorial-Reihe enthält dieses Tutorial ein Beispiel für einige Flask-Erweiterungen. Wir werden die folgenden Erweiterungen diskutieren.
- Flasche Twitter Oembedder
- Kolben-API
- Flasche RESTful
=> Besuchen Sie hier, um Flask From Scratch zu lernen
Obwohl wir in unseren vorherigen Tutorials viele Erweiterungen besprochen haben, wird in diesem Tutorial mehr unter dem Gesichtspunkt der Untersuchung der Komponenten einer Flask-Erweiterung erläutert.
Was du lernen wirst:
Was ist eine Kolbenverlängerung?
Eine Flask-Erweiterung ist ein installierbares Python-Modul oder ein Paket, das zusätzliche Funktionen für eine Flask-Anwendung implementiert. Eine Flask-Erweiterung kann so einfach sein wie die, die die Verwendung einer externen API wie Twitter zum Einbetten eines Tweets in eine Webseite unterstützt.
Eine Flask-Erweiterung kann auch ein neues Framework wie Flask API oder Flask-RESTful sein, um Apps zu erstellen, die einem Architekturmuster oder einem Entwicklungsparadigma folgen.
Flasche Twitter Oembedder
In diesem Abschnitt nehmen wir das Beispiel eines vorhandenen Open-Source-Einfachprojekts aus Hier
Klonen Sie dieses Projekt auf Ihrem lokalen Computer und installieren Sie es mithilfe von pip mithilfe des unten genannten Befehls.
# in an activated virtual environment pip install -e flask_twitter_oembedder/
Diese Erweiterung hilft beim Einbetten eines Tweets mithilfe eines Jinja2-Vorlagen-Tags. Um diese Erweiterung nutzen zu können, müssen Sie jedoch ein Entwicklerkonto bei Twitter beantragen. Sobald Sie ein Entwicklerkonto erhalten haben, erstellen Sie eine App und Sie erhalten Schlüssel und Geheimnisse, um die API von Twitter zu nutzen.
So öffnen Sie eine JAR-Datei mit einer Java-Laufzeitumgebung
Bewahren Sie die Schlüssel und Geheimnisse an einem sicheren Ort auf, damit die Anwendung darauf zugreifen kann. Wir haben diese in den Umgebungsvariablen beibehalten und der Flask-App-Konfiguration hinzugefügt, wie unten gezeigt. Unsere Demo-App speichert die Konfigurationswerte in der Datei 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)
Wir erhalten die Werte der erforderlichen Variablen aus den Umgebungsvariablen. Wenn der entsprechende Wert in der Umgebungsvariablen nicht vorhanden ist, wird dieser als Keine gespeichert.
Wenn Sie die obigen Zeilen in die Konfigurationsdatei eingefügt haben, rufen Sie die Datei __init__.py der Flask-Anwendung auf und initialisieren Sie sie, indem Sie sie wie unten gezeigt ändern.
from flask_caching import Cache from flask_twitter_oembedder import TwitterOEmbedder cache = Cache(app, config={'CACHE_TYPE': 'simple'}) twitter_oembedder = TwitterOEmbedder(app, cache)
Diese Zeilen initialisieren die Flask-Erweiterung. Jetzt können wir hello.html unter Vorlagen ändern und das unten genannte Tag wie unten gezeigt hinzufügen.
{{ oembed_tweet('1277228221394587649') }}
Wir haben dieses Tag vor der for-Schleife in der vorhandenen Vorlage hinzugefügt. Diese sehr lange Ziffer ist die Tweet-ID. Wir erhalten diese ID von der Tweet-URL nach dem Tweeten. Nach dem Speichern der Vorlagendatei navigieren wir zum Endpunkt / hello / greetings und erhalten die Ergebnisse, wie im folgenden Bild gezeigt.
Flasche RESTful
Unsere Flask RESTful-Beispielanwendung berücksichtigt die Einschränkungen der REST-Architektur. Es ist jedoch nicht wie ein Protokoll, und die Entwickler sind bei der Implementierung von Funktionen flexibel und folgen den REST-Einschränkungen.
Bitte lesen Sie mehr über die Einschränkungen der REST-Architektur Hier .
Moderne Webanwendungen ermöglichen es Clients, die Ressourcen an einfach zu lesenden und stabilen Endpunkten zustandslos anzufordern.
Kolben RESTful Beispiel
Lassen Sie uns einige Funktionen auch in unserer Flask RESTful-Beispielanwendung auf RESTful-Weise implementieren.
Wir haben eine Möglichkeit, Daten zu Alben und Songs zu speichern und bereitzustellen. Implementieren wir eine API mit der Flask RESTful-Erweiterung.
Installieren Sie zuerst Flask RESTful mit dem folgenden Befehl.
pip install flask-restful
Lassen Sie uns zur einfachen Wartung und zum besseren Verständnis eine Datei mit dem Namen api.py im App-Verzeichnis erstellen und die folgenden Codezeilen darin erwähnen. Betrachten Sie vorerst APIs, die Flask Views ähneln.
Wir werden Funktionen implementieren, die HTTP-Verben entsprechen, um zu antworten, wenn der Client eine Anforderung an den Server-Endpunkt der Anwendung sendet.
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/')
Wir haben zwei Ressourcen namens Songs und Song erstellt, indem wir die abstrakte Klasse Resource von Flask-RESTful in Unterklassen unterteilt haben. Die Klasse namens Songs verfügt über zwei Methoden zum Abrufen und Veröffentlichen, die den beiden HTTP-Verben entsprechen. GET bzw. POST.
Die Songs-Ressource liefert alle Songs an den registrierten Endpunkt, wenn der Client dies anfordert, und fügt der Liste der vorhandenen Songs einen Song hinzu, wenn die Daten am selben Endpunkt veröffentlicht werden.
In ähnlicher Weise werden im Fall der Klasse Song HTTP GET, DELETE und PUT mit den Methoden get, delete und put implementiert. Die Methode get sendet eine Antwort mit dem angeforderten Song als JSON, die Methode delete entfernt einen Song aus SONGS und die put-Methode aktualisiert einen vorhandenen Song in SONGS.
Fügen Sie diese Ressourcen nun zu unserer Beispielanwendung hinzu, indem Sie sie in der Datei __init__.py unter dem App-Ordner initialisieren.
from . import api
Lassen Sie uns curl installieren und die Funktionen auf den angegebenen Endpunkten ausprobieren.
sudo apt -y install curl
Holen Sie sich alle Songs
curl -k https://localhost:8080/api/v1/songs
Wir erhalten die Antwort wie unten gezeigt.
{ 'songs': { 'Song1': { 'title': 'Past Life', 'singer': 'Selena Gomez' } } }
Verwenden wir nun den unten genannten Befehl, um ein Lied hinzuzufügen.
curl -k -d 'title=Summer Days&singer=Martin Garrix' https://localhost:8080/api/v1/songs
Wir erhalten die Antwort von unserer API, wie unten gezeigt.
{ 'Song2': { 'title': 'Summer Days', 'singer': 'Martin Garrix2' } }
Wenn wir nun die Liste der Songs wie im vorherigen Befehl abfragen, erhalten wir beide Songs in der Antwort.
{ 'songs': { 'Song1': { 'title': 'Past Life', 'singer': 'Selena Gomez' }, 'Song2': { 'title': 'Summer Days', 'singer': 'Martin Garrix2' } } }
Ebenso funktionieren HTTP DELETE und PUT wie vorgesehen. Fügen wir einige Tests für die Version v1 dieser von uns erstellten einfachen API hinzu.
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
Führen Sie diese Tests nun wie unten gezeigt über die Befehlszeile aus.
pytest app/tests/test_api.py
In ähnlicher Weise können wir Tests für andere Methoden schreiben, um eine bessere Abdeckung zu erzielen.
Es ist wichtig zu beachten, dass die von uns hinzugefügten Songs als Teil des einzelnen Prozesses, unter dem der Entwicklungsserver ausgeführt wird, bestehen bleiben. Dies bedeutet, dass alle neuen Daten verloren gehen, sobald der Prozess beendet wird.
Darüber hinaus scheint die Aufgabe, Version v1 der API zu erstellen, überflüssig zu sein und unterscheidet sich von der Art und Weise, wie wir Daten in der Anwendung mithilfe von Formularen und Ansichten gespeichert haben.
Normalerweise erfordert die RESTful-API-Implementierung das Abrufen von Daten von den Clients, das Marshalling zwischen Client- und Serverenden und die Persistenz mithilfe der von uns erstellten Datenbankmodelle.
Was sind die Phasen des Lebenszyklus der Softwareentwicklung?
Darüber hinaus sind die Endpunkte für unbeabsichtigte und gestaltete Eingaben gesichert.
Daher empfehlen wir, dass die oben angegebenen Beispiele nur zum Erlernen der Konzepte und Einschränkungen der REST-Architektur mithilfe von HTTP-Methoden dienen. Bitte denken Sie daran, dass dies nur eine der vielen Möglichkeiten ist, wie Webdienste im Allgemeinen erstellt werden. Darüber hinaus gibt es viele Möglichkeiten, wie die REST-Architektur implementiert werden kann.
Wir empfehlen den Lesern, weiter zu untersuchen, wie REST mithilfe anderer Protokolle und nicht nur JSON und HTTP unterschiedliche Dateiformate und benutzerdefinierte Methoden haben kann. Um einen Einblick in eine Produktionsanwendung zu geben, geben wir das folgende Beispiel.
Wir verwenden einen Flask-Appbuilder BaseApi, um ähnliche Funktionen unter verschiedenen Endpunkten zu implementieren. Öffnen Sie die Datei api.py und aktualisieren Sie sie mit dem unten angegebenen Code.
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)
Fügen wir nun einige weitere Tests hinzu, um die Endpunkte zu testen, die mit dem Flask-Appbuilder erstellt wurden. Wir werden diese Tests mit PyTest durchführen.
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 hilft auch bei der Bereitstellung der Swagger-Benutzeroberfläche zum Auflisten und Testen der veröffentlichten API. Öffnen Sie config.py und aktualisieren Sie es mit der unten gezeigten Konfiguration.
FAB_API_SWAGGER_UI=True
Navigieren Sie nun zu https: // localhost: 8080 / swaggerview / v1, und Sie können die Swagger-Ansicht wie unten gezeigt sehen.
Erstellen wir nun APIs für die vorhandenen Datenbankmodelle. Wir müssen das ModelApi des Flask-Appbuilder verwenden.
Aktualisieren Sie die Datei api.py mit den folgenden Codezeilen.
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)
Nachdem wir eine Klasse basierend auf ModelRestApi definiert haben, müssen wir sie erneut mit der Methode add_api beim Flask-Appbuilder registrieren.
Navigieren Sie nun wie zuvor zur Swagger-Benutzeroberfläche, und Sie sehen eine API-Referenz ähnlich der unten gezeigten.
Sie können die API in der Swagger-Ansicht ausprobieren oder die Locke wie zuvor an die Endpunkte senden.
Kolben-API
Die Flask-API ist ein Framework, das dem Django REST-Framework sehr ähnlich ist. Sie können auf die Flask API-Dokumentation zugreifen Hier . Es ist der Ersatz für das Flask-Framework.
Wir können eines der oben angegebenen Beispiele auswählen, um die Flask REST API-gesteuerten Funktionen in unserer Anwendung zu implementieren.
Lassen Sie uns nun die Quelle festschreiben und die Änderungen am Ursprungs-Repo mit Git veröffentlichen. Sobald wir uns mit dem Filialnamen auf den Ursprung festlegen und eine Pull-Anfrage senden, werden die Komponententests im Rahmen der Pull-Request-Prüfungen automatisch unter den Git-Aktionen ausgelöst.
FlaschenrestPlus
Flask RestPlus ist eine weitere Flask-Erweiterung, die bei der Erstellung der REST-API mithilfe von Flask hilft. Dieses Projekt wurde in eine andere Erweiterung namens Flask-RESTX aufgeteilt und wird nicht mehr verwaltet.
Dieses Projekt verfügt über eine gute Sammlung von Dekorateuren, die die APIs beschreiben und deren Dokumentation mit Swagger verfügbar machen. Sie können die Details dieses Projekts überprüfen Hier .
Häufig gestellte Fragen
F # 1) Wie erstelle ich eine REST-API mit Flask?
Antworten: Wir können das Flask-Framework mit anderen Flask-Erweiterungen wie Flask-RESTful, Flask-API, Flask-RESTX, Connexion usw. verwenden, um REST-API-basierte Webanwendungen zu erstellen. Die meisten Erweiterungen funktionieren mit den anderen integrierten Funktionen des Flask-Frameworks und allen anderen vorhandenen ORM / Bibliotheken.
F # 2) Was ist ein REST-API-Beispiel?
Antworten: Eine Beispielanwendung, die die RESTFul-API implementiert, finden Sie in diesem Lernprogramm. Flask-RESTful wurde verwendet, um die Beispielanwendung zu erstellen. Lesen Sie in diesem Tutorial mehr über den Beispielabschnitt Flask RESTful.
F # 3) Wofür ist RESTful API?
Antworten: Eine Anwendungsprogrammierschnittstelle, die im Allgemeinen HTTP-Anforderungen verwendet und über entsprechende Backend-Methoden für HTTP-Verben wie GET, POST, PUT usw. verfügt, um die Kommunikation zwischen Client und Server zu ermöglichen, wird als RESTful-API bezeichnet.
MP3-Musik-Downloader-App für Android
Eine solche Anwendung folgt den Prinzipien und Einschränkungen der REST-Architektur, um ihre Funktionen zu implementieren.
Fazit
Wir haben die Konzepte von Flask-Erweiterungen mithilfe von drei Erweiterungen behandelt, z. B. Flask-twitter-oembedder, Flask API und Flask-RESTful.
Mit Hilfe des Flask-Twitter-Oembedder haben wir auch die Konzepte der Twitter-API behandelt. Im Allgemeinen haben wir auch die Ideen zur Implementierung eines RESTful-Webdienstes aufgenommen, der den Prinzipien und Einschränkungen der REST-Architektur folgt.
In unserem nächsten Tutorial werden wir den Vergleich zwischen Django und Flask Framework behandeln, um unseren Lesern zu helfen, die Stärken und Schwächen beider Frameworks zu verstehen. Es hilft auch bei der Auswahl eines Frameworks gegen das andere basierend auf den jeweiligen Projektanforderungen.
=> Entdecken Sie hier die Simple Flask Training Series
Literatur-Empfehlungen
- API-Test-Tutorial: Eine vollständige Anleitung für Anfänger
- Rest API Tutorial: REST API Architektur und Einschränkungen
- Parasoft SOAtest Tutorial: Skriptloses API-Testtool
- Wie erstelle ich eine API-Dokumentation in Postman?
- GitHub REST API Tutorial - REST API Unterstützung in GitHub
- Wie verwende ich Postman zum Testen verschiedener API-Formate?
- POSTMAN Tutorial: API-Tests mit POSTMAN
- Top 31 beliebte Python Flask Interview Fragen mit Antworten