flask api tutorial with example extending flask with apis
Denne veiledningen i Flask API forklarer populære flaskeutvidelser som Flask twitter Oembedder, Flask API og Flask RESTful med eksempler:
Flask-rammeverket har ganske mange utvidelser. Disse utvidelsene er ganske nyttige og er enkle å utvikle. Vi vet at Flask-rammeverket er veldig pythonisk og har et minimalt sett med APIer, og er veldig fleksibelt, og derfor har Flask-fellesskapet opprettet så mange utvidelser for mange spesifikke oppgaver.
Som en del av opplæringsserien Flask har denne opplæringen et eksempel på noen få Flask-utvidelser. Vi vil diskutere følgende utvidelser.
- Kolbe twitter Oembedder
- Flask API
- Kolbe RESTful
=> Besøk her for å lære kolbe fra bunnen av
Selv om vi har diskutert mange utvidelser som en del av våre tidligere opplæringsprogrammer, forklarer denne opplæringen mer med perspektivet til å undersøke komponentene i en Flask-utvidelse.
Hva du vil lære:
Hva er en kolbeutvidelse
En kolbeutvidelse er en installerbar Python-modul eller en pakke som implementerer tilleggsfunksjonalitet til et Flask-program. En Flask-utvidelse kan være så enkel som den som legger til støtte for å konsumere en ekstern API som Twitter for å legge inn en tweet på en webside.
Eller en Flask-utvidelse kan være et nytt rammeverk som Flask API eller Flask-RESTful for å bygge apper som følger et arkitektonisk mønster eller et utviklingsparadigme.
Kolbe twitter Oembedder
I denne delen tar vi eksemplet på et eksisterende enkelt kildekode med åpen kildekode fra her
Klon dette prosjektet på din lokale maskin og installer det ved hjelp av pip ved hjelp av kommandoen nedenfor.
# in an activated virtual environment pip install -e flask_twitter_oembedder/
Denne utvidelsen hjelper til med å legge inn en Tweet ved hjelp av en Jinja2 mal-tag. For å bruke denne utvidelsen må du imidlertid søke om en utviklerkonto på Twitter. Når du har fått en utviklerkonto, oppretter du en app, så får du nøkler og hemmeligheter for å konsumere Twitters API.
safe gratis youtube til mp3 converter
Når du har nøklene og hemmelighetene, lagrer du dem på et trygt sted slik at applikasjonen kan få tilgang til disse. Vi har holdt dem i miljøvariablene og har lagt til Flask-appkonfigurasjonen, som vist nedenfor. Demo-appen vår beholder konfigurasjonsverdiene 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 verdiene til de nødvendige variablene fra miljøvariablene. Hvis den tilsvarende verdien ikke er tilstede i miljøvariabelen, lagres den som Ingen.
Når du har lagt til de ovennevnte linjene i konfigurasjonsfilen, går du til flaskeapplikasjonens __init__.py og initialiserer den ved å endre 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 linjene vil initialisere Flask-utvidelsen. Nå kan vi endre hello.html under maler og legge til den nevnte koden som vist nedenfor.
{{ oembed_tweet('1277228221394587649') }}
Vi la til denne taggen før for-sløyfen i den eksisterende malen. Det veldig lange sifferet er tweet-ID-en. Vi får denne ID-en fra Tweet URL etter tweeting. Etter å ha lagret malfilen, navigerer vi til sluttpunktet / hallo / hilsen og mottar resultatene, som vist i bildet nedenfor.

Kolbe RESTful
Vårt eksempel på applikasjonen Flask RESTful er den som respekterer begrensningene i REST-arkitekturen. Imidlertid er det ikke som en protokoll, og utviklerne er fleksible mens de implementerer funksjoner, i henhold til REST-begrensningene.
Les mer om begrensningene for REST-arkitekturen her .
Moderne webapplikasjoner gjør det mulig for klienter å be om ressurser på lettleste og stabile endepunkter på en statsløs måte.
Flask RESTful Eksempel
La oss implementere noen funksjoner på en RESTful måte i vårt Flask RESTful eksempel-applikasjon.
Vi har en måte å lagre og servere data relatert til album og sanger på. La oss implementere et API ved hjelp av Flask RESTful-utvidelse.
apriori algoritme i data mining med eksempel
Først installerer du Flask RESTful ved å bruke kommandoen nedenfor.
pip install flask-restful
For enkelt vedlikehold og forståelse, la oss lage en fil kalt api.py inne i appkatalogen og nevne følgende kodelinjer i den. Foreløpig, vurder APIer som ligner på Flask Views.
Vi skal implementere funksjoner som tilsvarer HTTP-verb for å svare når klienten sender en forespørsel til serverens endepunkt for applikasjonen.
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 laget to ressurser kalt Songs and Song ved å underklasse Resource abstract class of Flask-RESTful. Klassen som heter Songs har to metoder get and post som tilsvarer de to HTTP-verbene; GET og POST, henholdsvis.
Songs-ressursen serverer alle sangene til det registrerte endepunktet når klienten ber om det, og legger til en sang i listen over eksisterende sanger når dataene blir lagt ut på samme endepunkt.
På samme måte, når det gjelder klasse Song, blir HTTP GET, DELETE og PUT implementert ved hjelp av metodene get, delete og put. Method get sender et svar med den forespurte sangen som JSON, metoden delete fjerner en sang fra SONGS, og put-metoden oppdaterer en eksisterende sang i SONGS.
La oss nå legge til disse ressursene i eksempelprogrammet vårt ved å initialisere dem i filen __init__.py under app-mappen.
from . import api
La oss installere krøll og prøve funksjonene på de oppgitte endepunktene.
sudo apt -y install curl
Få alle sanger
curl -k https://localhost:8080/api/v1/songs
Vi får svaret, som vist nedenfor.
{ 'songs': { 'Song1': { 'title': 'Past Life', 'singer': 'Selena Gomez' } } }
La oss nå bruke kommandoen nedenfor for å legge til en sang.
curl -k -d 'title=Summer Days&singer=Martin Garrix' https://localhost:8080/api/v1/songs
Vi får svaret fra API-et vårt, som vist nedenfor.
{ 'Song2': { 'title': 'Summer Days', 'singer': 'Martin Garrix2' } }
Nå igjen, hvis vi spør etter listen over sanger som vi gjorde i forrige kommando, og vi vil få 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 som forutsatt. La oss legge til noen tester for versjon v1 av denne enkle API-en som vi har opprettet.
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
Kjør nå disse testene fra kommandolinjen, som vist nedenfor.
pytest app/tests/test_api.py
På samme måte kan vi skrive tester for andre metoder for mer dekning.
En viktig ting å notere er at sangene vi la til fortsetter som en del av den eneste prosessen som utviklingsserveren kjører under. Det betyr at alle nye data vil gå tapt så snart prosessen slås av.
Videre virker oppgaven med å lage versjon v1 av APIen overflødig, og den er annerledes enn måten vi lagret data på i applikasjonen ved hjelp av skjemaer og visninger.
Vanligvis krever implementering av RESTful API å få data fra klientene, marshaling mellom klient- og serverendene, og utholdenhet ved hjelp av databasmodeller som vi har opprettet.
Videre er endepunktene sikret for utilsiktede og utformede innganger.
Derfor anbefaler vi at de ovennevnte eksemplene bare er for å lære konseptene og begrensningene til REST-arkitekturen ved hjelp av HTTP-metoder. Husk at dette bare er en av de mange måtene webtjenester generelt opprettes på. Videre er det mange måter REST-arkitekturen kan implementeres på.
Vi oppfordrer leserne til å utforske nærmere hvordan REST kan ha forskjellige filformater og tilpassede metoder ved hjelp av andre protokoller og ikke bare JSON og HTTP. Bare for å få et glimt av en produksjonsbruk, gir vi eksemplet nedenfor.
Vi bruker en Flask-Appbuilder BaseApi for å implementere lignende funksjoner under forskjellige sluttpunkter. Åpne api.py-filen og oppdater den med koden nedenfor.
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)
La oss nå legge til noen flere tester for å teste sluttpunktene som er bygget ved hjelp av Flask-Appbuilder. Vi vil kjøre disse testene ved hjelp av 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 hjelper også med å tilby Swagger UI til å liste og prøve publisert API. Åpne config.py og oppdater den med konfigurasjonen vist nedenfor.
FAB_API_SWAGGER_UI=True
Naviger nå til https: // localhost: 8080 / swaggerview / v1, og du vil kunne se Swagger-visningen som vist nedenfor.

La oss nå lage API-er for eksisterende databasemodeller som vi har. Vi må bruke ModelApi til Flask-Appbuilder.
Oppdater 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)
Etter å ha definert en klasse basert på ModelRestApi, må vi igjen registrere den hos Flask-Appbuilder ved hjelp av metoden add_api.
Naviger nå til Swagger UI som tidligere, og du vil se en API-referanse som den som er vist nedenfor.

Du kan prøve API-en fra Swagger-visningen eller ved å sende krøllen til endepunktene som tidligere.
Flask API
Flask API er et rammeverk som er ganske likt Django REST-rammeverket. Du kan få tilgang til Flask API-dokumentasjon her . Det er erstatningsstedet for Flask-rammeverket.
Vi kan velge hvilket som helst av de ovennevnte eksemplene for å implementere de Flask REST API-drevne funksjonene i applikasjonen vår.
La oss nå forplikte kilden og publisere endringene i opprinnelsesreposen ved hjelp av Git. Så snart vi forplikter oss til opprinnelsen med filialnavnet og sender en pull-forespørsel, vil enhetstestene automatisk utløse under Git Actions som en del av pull-anmodningen.
Flask RestPlus
Flask RestPlus er en ekstra Flask-utvidelse som hjelper til med å opprette REST API ved hjelp av Flask. Dette prosjektet er gitt inn i en annen utvidelse kalt Flask-RESTX og vedlikeholdes ikke lenger.
Dette prosjektet har en god samling dekoratører for å beskrive API-ene og avslører dokumentasjonen ved hjelp av Swagger. Du kan sjekke detaljene i dette prosjektet her .
ofte stilte spørsmål
Sp # 1) Hvordan oppretter jeg et REST API med Flask?
Svar: Vi kan bruke Flask-rammeverket med andre Flask-utvidelser som Flask-RESTful, Flask API, Flask RESTX, Connexion, etc. for å lage REST API-baserte webapplikasjoner. De fleste utvidelsene fungerer med de andre innebygde funksjonene i Flask framework og andre eksisterende ORM / biblioteker.
Q # 2) Hva er et REST API-eksempel?
Svar: Et eksempel på et program som implementerer RESTFul API er gitt i denne veiledningen. Flask-RESTful har blitt brukt til å lage prøveprogrammet. Les om delen Flask RESTful i denne veiledningen.
Q # 3) Hva er RESTful API for?
Svar: Et applikasjonsprogrammeringsgrensesnitt som vanligvis bruker HTTP-forespørsler og har tilsvarende backend-metoder for HTTP-verb som GET, POST, PUT, etc. for å tillate kommunikasjon mellom klient og server, kalles en RESTful API.
java koding intervju spørsmål skrive kode
En slik applikasjon følger REST-arkitekturprinsippene og begrensninger for å implementere funksjonene.
Konklusjon
Vi dekket begrepene Flask-utvidelser ved hjelp av tre utvidelser, for eksempel Flask-twitter-oembedder, Flask API og Flask-RESTful.
Ved hjelp av Flask-twitter-oembedder dekket vi også begrepene Twitter API. Generelt har vi også tatt med ideene om å implementere en RESTful-nettjeneste, som følger REST-arkitekturprinsippene og begrensningene.
I vår neste opplæring vil vi dekke sammenligningen mellom Django og Flask framework for å hjelpe leserne våre med å forstå styrken og svakheten til begge rammene. Det vil også være med på å velge det ene rammeverket mot det andre basert på spesifikke prosjektkrav.
=> Utforsk Simple Flask Training Series her
Anbefalt lesing
- API Testing Tutorial: En komplett guide for nybegynnere
- Rest API Tutorial: REST API Architecture And Constraints
- Parasoft SOAtest Tutorial: Scriptless API Testing Tool
- Hvordan lage API-dokumentasjon i postbud?
- GitHub REST API Tutorial - REST API Support i GitHub
- Hvordan bruke Postman til å teste forskjellige API-formater?
- POSTMAN-veiledning: API-testing ved hjelp av POSTMAN
- Topp 31 populære Python Flask-intervjuspørsmål med svar