flask api tutorial with example extending flask with apis
Tento výukový program pro Flask API vysvětluje populární rozšíření Flask jako Flask twitter Oembedder, Flask API a Flask RESTful s příklady:
Flask framework má poměrně hojný počet rozšíření. Tato rozšíření jsou velmi užitečná a lze je snadno vyvinout. Víme, že rámec Flask je velmi Pythonic a má minimální sadu API a je velmi flexibilní, což je důvod, proč komunita Flask vytvořila tolik rozšíření pro mnoho konkrétních úkolů.
Jako součást řady kurzů Flask má tento kurz příklad několika rozšíření Flask. Budeme diskutovat o následujících rozšířeních.
- Baňkový twitter Oembedder
- Flask API
- Baňka RESTful
=> Navštivte zde a naučíte se baňky od nuly
Ačkoli jsme v rámci našich předchozích kurzů diskutovali o mnoha rozšířeních, tento kurz vysvětluje více s perspektivou zkoumání komponent rozšíření Flask.
Co se naučíte:
Co je to prodloužení baňky
Flask extension je instalovatelný modul Pythonu nebo balíček, který implementuje další funkce do aplikace Flask. Rozšíření Flask může být stejně jednoduché jako rozšíření, které přidává podporu pro konzumaci externího API, jako je Twitter, pro vložení tweetu na webovou stránku.
Nebo rozšíření Flask může být nový rámec, jako je Flask API nebo Flask-RESTful k vytváření aplikací, které se řídí architektonickým vzorem nebo vývojovým paradigmatem.
Baňkový twitter Oembedder
V této části si vezmeme příklad existujícího open-source jednoduchého projektu z tady
Naklonujte tento projekt do místního počítače a nainstalujte jej pomocí pipu pomocí níže uvedeného příkazu.
# in an activated virtual environment pip install -e flask_twitter_oembedder/
Toto rozšíření pomáhá při vkládání tweetu pomocí značky šablony Jinja2. Chcete-li však použít toto rozšíření, budete muset požádat o účet vývojáře na Twitteru. Jakmile získáte účet vývojáře, vytvořte si aplikaci a získáte klíče a tajemství pro využití rozhraní API Twitteru.
co je kontrola kvality a zajištění kvality
Jakmile máte klíče a tajemství, uložte je na bezpečném místě, aby k nim aplikace měla přístup. Zachovali jsme je v proměnných prostředí a přidali jsme do konfigurace aplikace Flask, jak je uvedeno níže. Naše ukázková aplikace uchovává hodnoty konfigurace v souboru 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)
Hodnoty požadovaných proměnných získáváme z proměnných prostředí. Pokud odpovídající hodnota není v proměnné prostředí, pak je uložena jako Žádná.
Jakmile do konfiguračního souboru přidáte výše uvedené řádky, přejděte do __init__.py aplikace Flask a inicializujte ji úpravou, jak je znázorněno níže.
from flask_caching import Cache from flask_twitter_oembedder import TwitterOEmbedder cache = Cache(app, config={'CACHE_TYPE': 'simple'}) twitter_oembedder = TwitterOEmbedder(app, cache)
Tyto řádky inicializují rozšíření Flask. Nyní můžeme upravit hello.html pod šablonami a přidat níže uvedenou značku, jak je znázorněno níže.
{{ oembed_tweet('1277228221394587649') }}
Tuto značku jsme přidali před smyčku for ve stávající šabloně. Ta velmi dlouhá číslice je ID tweetu. Toto ID získáme z tweetové adresy URL po tweetu. Po uložení souboru šablony přejdeme do koncového bodu / hello / greetings a obdržíme výsledky, jak je znázorněno na následujícím obrázku.
Baňka RESTful
Naše ukázková aplikace Flask RESTful respektuje omezení architektury REST. Není to však jako protokol a vývojáři jsou při implementaci funkcí flexibilní a řídí se omezeními REST.
Přečtěte si prosím více o omezeních architektury REST tady .
Moderní webové aplikace umožňují klientům požadovat zdroje na snadno čitelných a stabilních koncových bodech bez státní příslušnosti.
Baňka RESTful Příklad
Pojďme implementovat některé funkce způsobem RESTful také v naší ukázkové aplikaci Flask RESTful.
Máme způsob ukládání a poskytování údajů týkajících se alb a skladeb. Pojďme implementovat API pomocí rozšíření Flask RESTful.
Nejprve nainstalujte Flask RESTful pomocí níže uvedeného příkazu.
pip install flask-restful
Pro snadnou údržbu a pochopení vytvořme soubor s názvem api.py uvnitř adresáře aplikace a zmíníme v něm následující řádky kódu. Prozatím zvažte rozhraní API podobná Flask Views.
Chystáme se implementovat funkce odpovídající slovesům HTTP, abychom odpověděli, když klient odešle požadavek na koncový bod serveru aplikace.
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/')
Vytvořili jsme dva zdroje zvané Songs a Song podle podtřídy Resource abstract class of Flask-RESTful. Třída s názvem Songs má dvě metody get a post odpovídající dvěma slovesům HTTP; GET a POST.
Prostředek Skladby slouží všem skladbám registrovanému koncovému bodu, když o to Klient požádá, a přidá skladbu do seznamu existujících skladeb, když jsou data zveřejněna ve stejném koncovém bodě.
Podobně v případě třídy Song jsou HTTP GET, DELETE a PUT implementovány pomocí metod get, delete a put. Metoda get odešle odpověď s požadovanou skladbou jako JSON, metoda odstranění odstraní skladbu ze skladeb SONGS a metoda put aktualizuje existující skladbu v skladbách SONGS.
Nyní přidáme tyto prostředky do naší ukázkové aplikace jejich inicializací v souboru __init__.py ve složce aplikace.
from . import api
Nainstalujeme zvlnění a vyzkoušejte funkce v uvedených koncových bodech.
sudo apt -y install curl
Získejte všechny skladby
curl -k https://localhost:8080/api/v1/songs
Dostaneme odpověď, jak je uvedeno níže.
{ 'songs': { 'Song1': { 'title': 'Past Life', 'singer': 'Selena Gomez' } } }
Nyní přidejme skladbu pomocí níže uvedeného příkazu.
curl -k -d 'title=Summer Days&singer=Martin Garrix' https://localhost:8080/api/v1/songs
Dostaneme odpověď z našeho API, jak je uvedeno níže.
{ 'Song2': { 'title': 'Summer Days', 'singer': 'Martin Garrix2' } }
Opět platí, že pokud zadáme dotaz na seznam skladeb, jako jsme to udělali v předchozím příkazu, dostaneme obě písně v odpovědi.
{ 'songs': { 'Song1': { 'title': 'Past Life', 'singer': 'Selena Gomez' }, 'Song2': { 'title': 'Summer Days', 'singer': 'Martin Garrix2' } } }
Podobně HTTP DELETE a PUT fungují podle plánu. Přidejte několik testů na verzi v1 tohoto jednoduchého rozhraní API, které jsme vytvořili.
jak používat zatmění pro c
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
Nyní spusťte tyto testy z příkazového řádku, jak je znázorněno níže.
pytest app/tests/test_api.py
Podobně můžeme psát testy pro další metody pro větší pokrytí.
Důležité je poznamenat, že skladby, které jsme přidali, přetrvávají jako součást jediného procesu, ve kterém běží vývojový server. To znamená, že všechna nová data budou ztracena, jakmile se proces vypne.
Úkol vytvořit verzi v1 API se navíc jeví jako nadbytečný a je odlišný od způsobu, jakým jsme ukládali data v aplikaci pomocí formulářů a pohledů.
Implementace RESTful API obvykle vyžaduje získávání dat od klientů, zařazování mezi klientem a servery a vytrvalost pomocí databázových modelů, které jsme vytvořili.
Koncové body jsou navíc zabezpečeny pro nechtěné a vytvořené vstupy.
Proto doporučujeme, aby výše uvedené příklady byly pouze pro učení konceptů a omezení architektury REST pomocí metod HTTP. Pamatujte, že toto je pouze jeden z mnoha způsobů vytváření webových služeb. Kromě toho existuje mnoho způsobů, jak lze implementovat architekturu REST.
Doporučujeme čtenářům, aby dále prozkoumali, jak může mít REST různé formáty souborů a vlastní metody pomocí jiných protokolů, nejen JSON a HTTP. Níže uvádíme příklad, abychom vám poskytli letmý pohled na jedno produkční použití.
K implementaci podobných funkcí v různých koncových bodech používáme Flask-Appbuilder BaseApi. Otevřete soubor api.py a aktualizujte jej níže uvedeným kódem.
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)
Nyní přidejme několik dalších testů k testování koncových bodů, které jsou vytvořeny pomocí nástroje Flask-Appbuilder. Tyto testy provedeme pomocí PyTestu.
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 také pomáhá při poskytování uživatelského rozhraní Swagger do seznamu a vyzkoušení publikovaného API. Otevřete soubor config.py a aktualizujte jej podle níže uvedené konfigurace.
FAB_API_SWAGGER_UI=True
Nyní přejděte na https: // localhost: 8080 / swaggerview / v1 a uvidíte Swagger zobrazení, jak je znázorněno níže.
Nyní vytvořme API pro stávající databázové modely, které máme. Musíme použít ModelApi nástroje Flask-Appbuilder.
Aktualizujte soubor api.py následujícími řádky kódu.
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 definování třídy založené na ModelRestApi ji znovu musíme zaregistrovat u Flask-Appbuilderu pomocí metody add_api.
Nyní přejděte na uživatelské rozhraní Swagger jako dříve a uvidíte odkaz na API podobný tomu, který je uveden níže.
Můžete vyzkoušet API z pohledu Swagger nebo odesláním zvlnění do koncových bodů jako dříve.
Flask API
Flask API je framework, který je docela podobný Django REST framework. Můžete získat přístup k dokumentaci Flask API tady . Jedná se o náhradu za Flask framework.
Můžeme si vybrat kterýkoli z výše uvedených příkladů k implementaci funkcí řízených Flask REST API v naší aplikaci.
Pojďme nyní potvrdit zdroj a publikovat změny původního repo pomocí Gitu. Jakmile jsme se zavázat k původu s názvem pobočky a odeslat požadavek na vytažení, jednotkové testy se automaticky spustí v rámci akcí Git jako součást kontroly požadavku na vytažení.
Baňka RestPlus
Flask RestPlus je další rozšíření Flask, které pomáhá při vytváření REST API pomocí Flask. Tento projekt byl rozvětven do jiného rozšíření s názvem Flask-RESTX a již není udržován.
Tento projekt má dobrou sbírku dekoratérů k popisu API a vystavuje svou dokumentaci pomocí Swagger. Můžete zkontrolovat podrobnosti tohoto projektu tady .
Často kladené otázky
Otázka č. 1) Jak vytvořím rozhraní REST API s bankou?
Odpovědět: Můžeme použít rámec Flask s dalšími rozšířeními Flask, jako jsou Flask-RESTful, Flask API, Flask RESTX, Connexion atd., Abychom vytvořili webové aplikace založené na REST API. Většina rozšíření funguje s dalšími integrovanými funkcemi rámce Flask a jakýchkoli dalších existujících ORM / knihoven.
Otázka č. 2) Co je příklad rozhraní REST API?
Odpovědět: V tomto kurzu je uvedena příklad aplikace, která implementuje rozhraní RESTFul API. Flask-RESTful byl použit k vytvoření ukázkové aplikace. Přečtěte si o části příkladu Flask RESTful v tomto kurzu.
Otázka č. 3) K čemu je RESTful API?
Odpovědět: Rozhraní aplikačního programování, které obecně používá požadavky HTTP a má odpovídající backendové metody pro slovesa HTTP, jako je GET, POST, PUT atd., Aby umožňovaly komunikaci mezi klientem a serverem, se nazývá RESTful API.
co je dobrý stahovač mp3
Taková aplikace se při implementaci svých funkcí řídí principy a omezeními architektury REST.
Závěr
Pojmy rozšíření Flask jsme pokryli pomocí tří rozšíření, například Flask-twitter-oembedder, Flask API a Flask-RESTful.
S pomocí Flask-twitter-oembedder jsme také pokryli koncepty Twitter API. Obecně jsme také zahrnuli myšlenky implementace webové služby RESTful, která se řídí principy a omezeními architektury REST.
V našem dalším kurzu se budeme zabývat porovnáním rámce Django a Flask, abychom našim čtenářům pomohli porozumět silným a slabým stránkám obou rámců. Pomůže také při výběru jednoho rámce proti druhému na základě konkrétních požadavků projektu.
=> Prozkoumejte zde sérii Simple Flask Training Series
Doporučené čtení
- Výukový program pro testování API: Kompletní průvodce pro začátečníky
- Výukový program REST API: REST API Architecture And Constraints
- Výukový program Parasoft SOAtest: Nástroj pro testování API bez skriptů
- Jak vytvořit dokumentaci API v Postmanu?
- Výukový program GitHub REST API - Podpora REST API v GitHubu
- Jak používat Postman pro testování různých formátů API?
- Výukový program POSTMAN: Testování API pomocí POSTMANU
- Top 31 populárních otázek na rozhovor s pythonovskou baňkou s odpověďmi