flask api tutorial with example extending flask with apis
Denne Flask API-vejledning forklarer populære Flask-udvidelser som Flask twitter Oembedder, Flask API og Flask RESTful med eksempler:
Flask-rammen har et stort antal udvidelser. Disse udvidelser er ret nyttige og er lette at udvikle. Vi ved, at Flask-rammen er meget pythonisk og har et minimalt sæt API'er og er meget fleksibel, hvorfor Flask-samfundet har oprettet så mange udvidelser til mange specifikke opgaver.
Som en del af Flask tutorial-serien har denne tutorial et eksempel på et par Flask extensions. Vi vil diskutere følgende udvidelser.
- Kolbe twitter Oembedder
- Kolbe API
- Kolbe RESTful
=> Besøg her for at lære kolbe fra bunden
Selvom vi har diskuteret mange udvidelser som en del af vores tidligere tutorials, forklarer denne tutorial mere med perspektivet til at undersøge komponenterne i en Flask-udvidelse.
Hvad du lærer:
Hvad er en kolbeudvidelse
En kolbeudvidelse er et Python-modul, der kan installeres, eller en pakke, der implementerer yderligere funktionalitet til en Flask-applikation. En flaskeudvidelse kan være så enkel som den, der tilføjer understøttelse af at forbruge en ekstern API såsom Twitter for at integrere en tweet på en webside.
Eller en Flask-udvidelse kan være en ny ramme såsom Flask API eller Flask-RESTful til at oprette apps, der følger et arkitektonisk mønster eller et udviklingsparadigme.
Kolbe twitter Oembedder
I dette afsnit tager vi eksemplet på et eksisterende open source-simpelt projekt fra her
Klon dette projekt i din lokale maskine og installer det ved hjælp af pip ved hjælp af nedenstående kommando.
# in an activated virtual environment pip install -e flask_twitter_oembedder/
Denne udvidelse hjælper med at indlejre en Tweet ved hjælp af et Jinja2-skabelontag. For at bruge denne udvidelse skal du dog ansøge om en udviklerkonto på Twitter. Når du har fået en udviklerkonto, skal du oprette en app, så får du nøgler og hemmeligheder til at forbruge Twitters API.
hvordan man spiller shockwave flash-objekter
Når du har nøglerne og hemmelighederne, skal du gemme dem et sikkert sted, så applikationen kan få adgang til dem. Vi har holdt dem i miljøvariablerne og har føjet til Flask-appkonfigurationen, som vist nedenfor. Vores demo-app gemmer konfigurationsværdierne i config.py-filen.
# 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)
Vi får værdierne for de krævede variabler fra miljøvariablerne. Hvis den tilsvarende værdi ikke er til stede i miljøvariablen, gemmes den som Ingen.
Når du har tilføjet ovenstående linjer i konfigurationsfilen, skal du gå til Flask-applikationens __init__.py og initialisere den ved at ændre den, som vist nedenfor.
from flask_caching import Cache from flask_twitter_oembedder import TwitterOEmbedder cache = Cache(app, config={'CACHE_TYPE': 'simple'}) twitter_oembedder = TwitterOEmbedder(app, cache)
Disse linjer initialiserer Flask-udvidelsen. Nu kan vi ændre hello.html under skabeloner og tilføje nedenstående tag som vist nedenfor.
{{ oembed_tweet('1277228221394587649') }}
Vi tilføjede dette tag før for-sløjfen i den eksisterende skabelon. Det meget lange ciffer er tweet-id'et. Vi får dette id fra Tweet URL efter tweeting. Efter at have gemt skabelonfilen navigerer vi til / hallo / hilsen-slutpunktet og modtager resultaterne som vist i nedenstående billede.

Kolbe RESTful
Vores eksempel på applikationen Flask RESTful er den, der respekterer begrænsningerne i REST-arkitekturen. Det er dog ikke som en protokol, og udviklerne er fleksible, mens de implementerer funktioner, efter REST-begrænsningerne.
Læs mere om begrænsningerne i REST-arkitekturen her .
Moderne webapplikationer giver klienter mulighed for at anmode om ressourcer ved letlæselige og stabile slutpunkter på en statsløs måde.
Kolbe RESTfuld eksempel
Lad os implementere nogle funktioner på en RESTful måde i vores eksempel på applikationen Flask RESTful.
Vi har en måde at gemme og servere data relateret til album og sange på. Lad os implementere en API ved hjælp af Flask RESTful-udvidelse.
Installer først Flask RESTful ved hjælp af nedenstående kommando.
pip install flask-restful
For nem vedligeholdelse og forståelse, lad os oprette en fil kaldet api.py inde i app-biblioteket og nævne følgende kodelinjer i den. Overvej for øjeblikket API'er svarende til Flask Views.
Vi vil implementere funktioner, der svarer til HTTP-verber for at svare, når klienten sender en anmodning til serverens slutpunkt i applikationen.
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/')
Vi har oprettet to ressourcer kaldet sange og sang ved at underklasse Ressource abstrakt klasse af Flask-RESTful. Klassen kaldet sange har to metoder til hentning og post svarende til de to HTTP-verber; GET henholdsvis POST.
Songs-ressourcen serverer alle sange til det registrerede slutpunkt, når klienten anmoder om det og føjer en sang til listen over eksisterende sange, når dataene sendes på det samme slutpunkt.
På samme måde implementeres HTTP GET, DELETE og PUT i tilfælde af klasse Song ved hjælp af metoderne get, delete og put. Method get sender et svar med den anmodede sang som JSON, method delete fjerner en sang fra SONGS, og put-metoden opdaterer en eksisterende sang i SONGS.
Lad os nu tilføje disse ressourcer til vores prøveapplikation ved at initialisere dem i filen __init__.py under app-mappen.
from . import api
Lad os installere krølle og prøve funktionerne på de angivne slutpunkter.
sudo apt -y install curl
Få alle sange
bedste mobiltelefon spion apps til Android
curl -k https://localhost:8080/api/v1/songs
Vi får svaret som vist nedenfor.
{ 'songs': { 'Song1': { 'title': 'Past Life', 'singer': 'Selena Gomez' } } }
Lad os nu bruge nedenstående kommando til at tilføje en sang.
curl -k -d 'title=Summer Days&singer=Martin Garrix' https://localhost:8080/api/v1/songs
Vi får svaret fra vores API, som vist nedenfor.
{ 'Song2': { 'title': 'Summer Days', 'singer': 'Martin Garrix2' } }
Nu igen, hvis vi forespørger på listen over sange som vi gjorde i den forrige kommando, og vi får begge sangene i svaret.
{ 'songs': { 'Song1': { 'title': 'Past Life', 'singer': 'Selena Gomez' }, 'Song2': { 'title': 'Summer Days', 'singer': 'Martin Garrix2' } } }
Tilsvarende fungerer HTTP DELETE og PUT efter hensigten. Lad os tilføje et par tests til version v1 af denne enkle API, som vi har oprettet.
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
Kør nu disse tests fra kommandolinjen, som vist nedenfor.
pytest app/tests/test_api.py
På samme måde kan vi skrive tests til andre metoder for mere dækning.
En vigtig ting at notere er, at de sange, vi tilføjede, fortsætter som en del af den enkelt proces, hvorunder udviklingsserveren kører. Det betyder, at alle nye data går tabt, så snart processen lukkes ned.
Desuden synes opgaven med at oprette version v1 af API'en overflødig, og den er anderledes end den måde, vi lagrede data på i applikationen ved hjælp af formularer og visninger.
Normalt kræver RESTful API-implementering at hente data fra klienterne, marshaling mellem klient- og serverender og vedholdenhed ved hjælp af databasemodeller, som vi har oprettet.
Desuden er slutpunkterne sikret for utilsigtede og udformede input.
Derfor anbefaler vi, at de ovennævnte eksempler kun er til at lære begreberne og begrænsningerne i REST-arkitekturen ved hjælp af HTTP-metoder. Husk, at dette kun er en af de mange måder, hvorpå webtjenester generelt oprettes. Der er desuden mange måder, hvorpå REST-arkitekturen kan implementeres.
Vi opfordrer læserne til at undersøge nærmere, hvordan REST kan have forskellige filformater og brugerdefinerede metoder ved hjælp af andre protokoller og ikke kun JSON og HTTP. Bare for at give et glimt af en produktionsanvendelse giver vi eksemplet nedenfor.
Vi bruger en Flask-Appbuilder BaseApi til at implementere lignende funktioner under forskellige slutpunkter. Åbn api.py-filen, og opdater den med nedenstående kode.
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)
Lad os nu tilføje nogle flere tests for at teste slutpunkterne, der er bygget ved hjælp af Flask-Appbuilder. Vi kører disse tests ved hjælp af 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 hjælper også med at give Swagger UI til at liste og prøve den offentliggjorte API. Åbn config.py og opdater den med konfigurationen vist nedenfor.
FAB_API_SWAGGER_UI=True
Naviger nu til https: // localhost: 8080 / swaggerview / v1, og du vil kunne se Swagger-visningen som vist nedenfor.

Lad os nu oprette API'er til de eksisterende databasemodeller, vi har. Vi skal bruge ModelApi fra Flask-Appbuilder.
Opdater api.py-filen med følgende kodelinjer.
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)
Efter at have defineret en klasse baseret på ModelRestApi, skal vi igen registrere den hos Flask-Appbuilder ved hjælp af metoden add_api.
Naviger nu til Swagger UI som tidligere, og du vil se en API-reference svarende til den vist nedenfor.

Du kan prøve API'en fra Swagger-visningen eller ved at sende krøllen til slutpunkterne som tidligere.
Kolbe API
Flask API er en ramme, der minder meget om Django REST-rammen. Du kan få adgang til Flask API-dokumentation her . Det er drop-in erstatning for Flask framework.
Vi kan vælge et af de ovennævnte eksempler til at implementere de Flask REST API-drevne funktioner i vores applikation.
Lad os nu forpligte kilden og offentliggøre ændringerne til oprindelsesreposen ved hjælp af Git. Så snart vi forpligter os til oprindelsen med filialnavnet og sender en pull-anmodning, udløses enhedstestene automatisk under Git Actions som en del af pull-anmodningen.
Flaske RestPlus
Flask RestPlus er endnu en Flask-udvidelse, der hjælper med oprettelsen af REST API ved hjælp af Flask. Dette projekt er blevet forked i en anden udvidelse kaldet Flask-RESTX og vedligeholdes ikke længere.
Dette projekt har en god samling dekoratører til at beskrive API'erne og udsætter dens dokumentation ved hjælp af Swagger. Du kan kontrollere detaljerne i dette projekt her .
Ofte stillede spørgsmål
Q # 1) Hvordan opretter jeg en REST API med Flask?
Svar: Vi kan bruge Flask-rammen med andre Flask-udvidelser såsom Flask-RESTful, Flask API, Flask RESTX, Connexion osv. Til at oprette REST API-baserede webapplikationer. De fleste af udvidelserne arbejder med de andre indbyggede funktioner i Flask framework og andre eksisterende ORM / biblioteker.
Q # 2) Hvad er et REST API-eksempel?
Svar: Et eksempel på et program, der implementerer RESTFul API, er givet i denne vejledning. Flask-RESTful er blevet brugt til at oprette prøveapplikationen. Læs om afsnittet om kolben RESTful i denne vejledning.
Q # 3) Hvad er RESTful API til?
Svar: En applikationsprogrammeringsgrænseflade, der generelt bruger HTTP-anmodninger og har tilsvarende backend-metoder til HTTP-verber som GET, POST, PUT osv. For at tillade kommunikation mellem klient og server kaldes en RESTful API.
hvordan man åbner .swf fil
En sådan applikation følger REST-arkitekturprincipper og begrænsninger for at implementere dens funktioner.
Konklusion
Vi dækkede begreberne Flask-udvidelser ved hjælp af tre udvidelser, såsom Flask-twitter-oembedder, Flask API og Flask-RESTful.
Ved hjælp af Flask-twitter-oembedder dækkede vi også begreberne Twitter API. Generelt har vi også inkluderet ideerne til at implementere en RESTful-webservice, der følger REST-arkitekturprincipperne og begrænsningerne.
I vores næste vejledning vil vi dække sammenligningen mellem Django og Flask framework for at hjælpe vores læsere med at forstå styrkerne og svaghederne ved begge rammerne. Det hjælper også med at vælge den ene ramme mod den anden baseret på de specifikke projektkrav.
=> Udforsk The Simple Flask Training Series her
Anbefalet læsning
- API-testvejledning: En komplet guide til begyndere
- Rest API Tutorial: REST API Architecture And Constraints
- Parasoft SOAtest Tutorial: Scriptless API Test Tool
- Sådan oprettes API-dokumentation i postbud?
- GitHub REST API Tutorial - REST API Support i GitHub
- Hvordan bruges postbud til test af forskellige API-formater?
- POSTMAN Tutorial: API-test ved hjælp af POSTMAN
- Top 31 populære Python Flask Interview-spørgsmål med svar