flask api tutorial with example extending flask with apis
Ta vadnica API Flask pojasnjuje priljubljene razširitve Flask, kot so Flask twitter Oembedder, Flask API in Flask RESTful, s primeri:
Okvir Flask ima precej obilnih razširitev. Te razširitve so zelo uporabne in jih je enostavno razviti. Vemo, da je okvir Flask zelo Pythonic in ima minimalen nabor API-jev ter je zelo prilagodljiv, zato je skupnost Flask ustvarila toliko razširitev za številne posebne naloge.
Kot del serije vadnic Flask ima ta vadnica primer nekaj razširitev bučke. Obravnavali bomo naslednje razširitve.
- Cvrkutanje bučke Oembedder
- API za bučko
- Bučka RESTful
=> Obiščite tukaj in se naučite bučke iz nič
Čeprav smo o številnih razširitvah razpravljali kot del naših prejšnjih vadnic, ta vadnica pojasnjuje več z vidika preučevanja komponent razširitve Flask.
Kaj se boste naučili:
Kaj je podaljšek bučke
Razširitev bučke je namestitveni modul Python ali paket, ki izvaja dodatno funkcionalnost aplikacije Flask. Razširitev Flask je lahko tako preprosta kot tista, ki dodaja podporo za uporabo zunanjega API-ja, kot je Twitter, za vdelavo tvita na spletno stran.
Razširitev Flask je lahko nov okvir, na primer API Flask ali Flask-RESTful, za izdelavo aplikacij, ki sledijo arhitekturnemu vzorcu ali razvojni paradigmi.
Cvrkutanje bučke Oembedder
V tem razdelku vzamemo primer obstoječega odprtokodnega preprostega projekta iz tukaj
Klonirajte ta projekt v lokalni računalnik in ga namestite s pomočjo pipa s pomočjo spodnjega ukaza.
# in an activated virtual environment pip install -e flask_twitter_oembedder/
Ta razširitev pomaga pri vdelavi Tweet-ja s pomočjo oznake predloge Jinja2. Za uporabo te razširitve pa se morate prijaviti za račun razvijalca na Twitterju. Ko dobite račun razvijalca, ustvarite aplikacijo in dobili boste ključe in skrivnosti za uporabo Twitterjevega API-ja.
najboljša programska oprema za sledenje e-pošte za gmail
Ko imate ključe in skrivnosti, jih shranite na varno, da bo aplikacija lahko do njih dostopala. Te smo ohranili v spremenljivkah okolja in jih dodali v konfiguracijo aplikacije Flask, kot je prikazano spodaj. Naša predstavitvena aplikacija hrani konfiguracijske vrednosti v datoteki 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)
Vrednosti zahtevanih spremenljivk dobimo iz spremenljivk okolja. Če ustrezna vrednost ni prisotna v spremenljivki okolja, je ta shranjena kot None.
Ko v konfiguracijsko datoteko dodate zgornje vrstice, pojdite na __init__.py aplikacije Flask in jo inicializirajte tako, da jo spremenite, kot je prikazano spodaj.
from flask_caching import Cache from flask_twitter_oembedder import TwitterOEmbedder cache = Cache(app, config={'CACHE_TYPE': 'simple'}) twitter_oembedder = TwitterOEmbedder(app, cache)
Te vrstice bodo inicializirale razširitev Flask. Zdaj lahko spremenimo hello.html v predloge in dodamo spodnjo oznako, kot je prikazano spodaj.
{{ oembed_tweet('1277228221394587649') }}
To oznako smo dodali pred zanko for v obstoječi predlogi. Ta zelo dolga številka je tweet ID. Ta id dobimo z URL-ja Tweet po tvitanju. Po shranjevanju datoteke s predlogo se pomaknemo do končne točke / hello / greetings in prejmemo rezultate, kot je prikazano na spodnji sliki.

Bučka RESTful
Naš primer aplikacije Flask RESTful je tisti, ki spoštuje omejitve arhitekture REST. Vendar ni podoben protokolu, razvijalci pa so prilagodljivi pri izvajanju funkcij, pri čemer upoštevajo omejitve REST.
Preberite več o omejitvah arhitekture REST tukaj .
Sodobne spletne aplikacije omogočajo strankam, da zahtevajo vire na lahko berljivih in stabilnih končnih točkah brez državljanstva.
Primer bučke RESTful
Uvedimo nekatere funkcije na RESTful način tudi v naši aplikaciji Flask RESTful.
Način shranjevanja in prikazovanja podatkov, povezanih z albumi in pesmimi, je na voljo. Uvedimo API z razširitvijo Flask RESTful.
Najprej namestite Flask RESTful z uporabo spodnjega ukaza.
pip install flask-restful
Za lažje vzdrževanje in razumevanje ustvarimo datoteko z imenom api.py znotraj imenika aplikacije in v njej omenimo naslednje vrstice kode. Za zdaj razmislite o API-jih, podobnih Flask Views.
Uvedli bomo funkcije, ki ustrezajo glagolom HTTP, da se odzovemo, ko odjemalec pošlje zahtevo strežniški končni točki aplikacije.
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/')
Z razvrstitvijo abstraktnega razreda virov Flask-RESTful smo ustvarili dva vira, imenovana Pesmi in Pesmi. Razred, imenovan Pesmi, ima dve metodi get in post, ki ustrezata dvema glagoloma HTTP; GET oziroma POST.
Vir Songs služi vse pesmi registrirani končni točki, ko jo naročnik zahteva, in doda skladbo na seznam obstoječih skladb, ko so podatki objavljeni na isti končni točki.
Podobno se v primeru razreda Song izvajajo HTTP GET, DELETE in PUT z uporabo metod get, delete in put. Metoda get pošlje odgovor z zahtevano skladbo kot JSON, metoda delete odstrani skladbo iz SONGS, metoda put pa posodobi obstoječo skladbo v SONGS.
Zdaj jim dodajte te vire v našo vzorčno aplikacijo, tako da jih inicializirate v datoteki __init__.py v mapi z aplikacijami.
from . import api
Namestimo curl in preizkusimo funkcije na navedenih končnih točkah.
sudo apt -y install curl
Pridobite vse pesmi
curl -k https://localhost:8080/api/v1/songs
Dobili smo odgovor, kot je prikazano spodaj.
{ 'songs': { 'Song1': { 'title': 'Past Life', 'singer': 'Selena Gomez' } } }
Zdaj uporabimo spodnji ukaz za dodajanje pesmi.
curl -k -d 'title=Summer Days&singer=Martin Garrix' https://localhost:8080/api/v1/songs
Odgovor dobimo od našega API-ja, kot je prikazano spodaj.
{ 'Song2': { 'title': 'Summer Days', 'singer': 'Martin Garrix2' } }
Zdaj, če povprašamo po seznamu skladb, kot smo to storili v prejšnjem ukazu, in bomo v odgovor dobili obe pesmi.
{ 'songs': { 'Song1': { 'title': 'Past Life', 'singer': 'Selena Gomez' }, 'Song2': { 'title': 'Summer Days', 'singer': 'Martin Garrix2' } } }
Podobno HTTP DELETE in PUT delujeta, kot je bilo predvideno. Dodamo nekaj testov za različico v1 tega preprostega API-ja, ki smo ga ustvarili.
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
Zdaj zaženite te teste iz ukazne vrstice, kot je prikazano spodaj.
pytest app/tests/test_api.py
Podobno lahko za večjo pokritost napišemo teste za druge metode.
najboljše spletno mesto za prenos youtube video posnetkov
Pomembno je omeniti, da skladbe, ki smo jih dodali, vztrajajo kot del posameznega procesa, v katerem se izvaja razvojni strežnik. To pomeni, da bodo vsi novi podatki izgubljeni takoj, ko se postopek zaustavi.
Poleg tega se zdi naloga ustvarjanja različice v1 API-ja odvečna in je drugačna od načina, kako smo s pomočjo obrazcev in pogledov shranjevali podatke v aplikaciji.
Izvedba API-ja RESTful običajno zahteva pridobivanje podatkov od odjemalcev, preurejanje med konci odjemalca in strežnika ter vztrajanje s pomočjo modelov baz podatkov, ki smo jih ustvarili.
Poleg tega so končne točke zaščitene za nenamerne in izdelane vnose.
Zato priporočamo, da so zgoraj navedeni primeri namenjeni samo učenju konceptov in omejitev arhitekture REST z uporabo metod HTTP. Upoštevajte, da je to le eden izmed mnogih načinov ustvarjanja spletnih storitev. Poleg tega je na veliko načinov mogoče uporabiti arhitekturo REST.
Bralce spodbujamo k nadaljnjemu raziskovanju, kako lahko ima REST različne oblike datotek in metode po meri z uporabo drugih protokolov in ne samo JSON in HTTP. Spodaj je primer le za vpogled v eno proizvodno uporabo.
Za izvajanje podobnih funkcij pod različnimi končnimi točkami uporabljamo Flask-Appbuilder BaseApi. Odprite datoteko api.py in jo posodobite s spodnjo kodo.
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)
Zdaj pa dodajte še nekaj testov za preizkušanje končnih točk, ki so zgrajene z uporabo Flask-Appbuilder. Te teste bomo izvedli s pomočjo PyTesta.
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 pomaga tudi pri zagotavljanju uporabniškega vmesnika Swagger za seznam in preizkus objavljenega API-ja. Odprite config.py in ga posodobite s konfiguracijo, prikazano spodaj.
FAB_API_SWAGGER_UI=True
Zdaj se pomaknite do https: // localhost: 8080 / swaggerview / v1 in videli boste pogled Swagger, kot je prikazano spodaj.

Zdaj pa ustvarimo API-je za obstoječe modele baz podatkov, ki jih imamo. Uporabiti moramo ModelApi Flask-Appbuilderja.
Datoteko api.py posodobite z naslednjimi vrsticami kode.
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)
Po opredelitvi razreda, ki temelji na ModelRestApi, ga moramo znova registrirati pri Flask-Appbuilderju z uporabo metode add_api.
Zdaj se pomaknite do uporabniškega vmesnika Swagger kot prej in videli boste sklic na API, podoben spodnjemu.

API lahko preizkusite v pogledu Swagger ali tako, da kodro pošljete na končne točke kot prej.
API za bučko
Flask API je ogrodje, ki je precej podobno ogrodju Django REST. Dostopate do dokumentacije Flask API tukaj . Je nadomestna zamenjava za okvir Flask.
Izberemo lahko katerega koli od zgoraj navedenih primerov, da v našo aplikacijo uporabimo funkcije Flask REST API.
Zdaj pa zapišimo vir in z Git objavimo spremembe v repo izvoru. Takoj, ko se z imenom podružnice zavzamemo za izvor in pošljemo zahtevo za vlečenje, se preskusi enot samodejno sprožijo pod Git Actions kot del preverjanj zahtev za vlečenje.
Steklenica RestPlus
Flask RestPlus je še ena razširitev Flask, ki pomaga pri ustvarjanju REST API z uporabo Flask. Ta projekt je bil razdeljen na drugo razširitev, imenovano Flask-RESTX, in se ne vzdržuje več.
Ta projekt ima dobro zbirko dekoraterjev, ki opisujejo API-je, in razkriva svojo dokumentacijo s pomočjo Swaggerja. Podrobnosti tega projekta lahko preverite tukaj .
Pogosto zastavljena vprašanja
V # 1) Kako z bučko ustvarim API REST?
Odgovor: Okvir Flask lahko uporabimo z drugimi razširitvami Flask, kot so Flask-RESTful, Flask API, Flask RESTX, Connexion itd., Da ustvarimo spletne aplikacije, ki temeljijo na REST API. Večina razširitev deluje z drugimi vgrajenimi funkcijami ogrodja Flask in drugimi obstoječimi ORM / knjižnicami.
V # 2) Kaj je primer REST API?
Odgovor: V tej vadnici je podan primer aplikacije, ki implementira API RESTFul. Za izdelavo vzorčne aplikacije je bil uporabljen Flask-RESTful. V tej vadnici preberite o razdelku primera Flask RESTful.
V # 3) Za kaj je API RESTful?
Odgovor: Aplikacijski vmesnik za programiranje, ki običajno uporablja zahteve HTTP in ima ustrezne zaledne metode za glagole HTTP, kot so GET, POST, PUT itd., Da omogoči komunikacijo med odjemalcem in strežnikom, se imenuje RESTful API.
podpira vprašanja in odgovore na razgovore
Takšna aplikacija upošteva načela in omejitve arhitekture REST za izvajanje svojih značilnosti.
Zaključek
Koncepti razširitev Flask smo zajeli s pomočjo treh razširitev, kot so Flask-twitter-oembedder, Flask API in Flask-RESTful.
S pomočjo Flask-twitter-oembedder smo zajeli tudi koncepte Twitter API-ja. Na splošno smo vključili tudi ideje o implementaciji spletne storitve RESTful, ki sledi načelom in omejitvam arhitekture REST.
V naslednji vadnici bomo zajeli primerjavo med Django in Flask framework, da bomo našim bralcem pomagali razumeti prednosti in slabosti obeh okvirov. Pomagal bo tudi pri izbiri enega okvira glede na drugega glede na posebne zahteve projekta.
=> Tukaj raziščite serijo preprostih bučk
Priporočeno branje
- Vadnica za testiranje API-jev: Popoln vodnik za začetnike
- Vadnica za API za počitek: Arhitektura in omejitve API-ja REST
- Vadnica za parasoft SOAtest: orodje za preizkušanje API-jev brez skript
- Kako ustvariti dokumentacijo API v poštarju?
- Vadnica za API za GitHub REST - Podpora za REST API v GitHub
- Kako uporabiti poštarja za testiranje različnih formatov API?
- Vadnica za POSTMAN: Testiranje API-jev z uporabo POSTMAN-a
- 31 najbolj priljubljenih vprašanj za intervju z Python Flask z odgovori