flask api tutorial with example extending flask with apis
Ovaj vodič za Flask API objašnjava popularna proširenja za Flask poput Flask twitter Oembedder, Flask API i Flask RESTful s primjerima:
Okvir Flask ima prilično bogat broj proširenja. Ova su proširenja vrlo korisna i lako ih je razviti. Znamo da je okvir Flask vrlo pitonski i da ima minimalni skup API-ja, te je vrlo fleksibilan, zbog čega je Flask zajednica stvorila toliko proširenja za mnoge specifične zadatke.
Kao dio serije tutorijala za Flask, ovaj vodič ima primjer nekoliko proširenja za Flask. Razgovarat ćemo o sljedećim proširenjima.
- Twitter tikvice Oembedder
- API tikvice
- Tikvica ODMORNA
=> Posjetite ovdje da biste naučili tikvicu od nule
Iako smo o mnogim proširenjima raspravljali kao dio naših prethodnih vodiča, ovaj vodič objašnjava više s perspektivom ispitivanja komponenata proširenja Flask.
Što ćete naučiti:
Što je produžetak tikvice
Proširenje tikvice je instalacijski Python modul ili paket koji implementira dodatnu funkcionalnost aplikacije Flask. Proširenje Flask može biti jednostavno kao ono koje dodaje podršku za upotrebu vanjskog API-ja poput Twittera za ugrađivanje tweetova na web stranicu.
Ili je proširenje Flask možda novi okvir kao što je Flask API ili Flask-RESTful za izgradnju aplikacija koje slijede arhitektonski obrazac ili razvojnu paradigmu.
Twitter tikvice Oembedder
U ovom ćemo odjeljku uzeti primjer postojećeg jednostavnog projekta otvorenog koda iz ovdje
Klonirajte ovaj projekt u svoj lokalni stroj i instalirajte ga pomoću pipa uz pomoć dolje navedene naredbe.
# in an activated virtual environment pip install -e flask_twitter_oembedder/
Ovo proširenje pomaže u ugrađivanju Tweet-a uz pomoć oznake Jinja2 predloška. Međutim, da biste koristili ovo proširenje, morat ćete se prijaviti za račun programera na Twitteru. Nakon što nabavite račun razvojnog programera, izradite aplikaciju i dobit ćete ključeve i tajne za upotrebu Twitterova API-ja.
kako bljesnuti bios windows 10
Kad dobijete ključeve i tajne, spremite ih na sigurno mjesto kako bi aplikacija mogla pristupiti njima. Zadržali smo one u varijablama okruženja i dodali u konfiguraciju aplikacije Flask, kao što je prikazano u nastavku. Naša demo aplikacija čuva vrijednosti konfiguracije u datoteci 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)
Vrijednosti traženih varijabli dobivamo iz varijabli okoline. Ako odgovarajuća vrijednost nije prisutna u varijabli okruženja, tada se ona pohranjuje kao Ništa.
Nakon što dodate gornje retke u konfiguracijsku datoteku, idite na __init__.py aplikacije Flask i inicijalizirajte je tako što ćete je izmijeniti, kao što je prikazano u nastavku.
from flask_caching import Cache from flask_twitter_oembedder import TwitterOEmbedder cache = Cache(app, config={'CACHE_TYPE': 'simple'}) twitter_oembedder = TwitterOEmbedder(app, cache)
Ovi će redovi inicijalizirati proširenje Flask. Sada možemo izmijeniti hello.html pod predlošcima i dodati dolje spomenutu oznaku kao što je prikazano u nastavku.
{{ oembed_tweet('1277228221394587649') }}
Ovu smo oznaku dodali prije petlje for u postojeći predložak. Ta vrlo dugačka brojka je tweet ID. Ovaj ID dobivamo s URL-a Tweet nakon tweetova. Nakon spremanja datoteke predloška, idemo do krajnje točke / hello / greetings i primamo rezultate, kao što je prikazano na donjoj slici.
Tikvica ODMORNA
Naša primjer aplikacije Flask RESTful je ona koja poštuje ograničenja REST arhitekture. Međutim, to nije poput protokola, a programeri su fleksibilni dok implementiraju značajke, slijedeći REST ograničenja.
Molimo pročitajte više o ograničenjima REST arhitekture ovdje .
Moderne web aplikacije omogućuju klijentima da traže resurse na lako čitljivim i stabilnim krajnjim točkama na način bez državljanstva.
Primjer odmorišta u tikvici
Primijenimo neke značajke na RESTful način i u našoj primjeru aplikacije Flask RESTful.
Imamo način za pohranu i posluživanje podataka koji se odnose na albume i pjesme. Primijenimo API pomoću proširenja Flask RESTful.
Prvo instalirajte Flask RESTful pomoću naredbe u nastavku.
pip install flask-restful
Za lako održavanje i razumijevanje, kreirajmo datoteku nazvanu api.py unutar direktorija aplikacije i u njoj spomenimo sljedeće retke koda. Za sada razmotrite API-je slične Flask Viewsima.
Implementirat ćemo značajke koje odgovaraju HTTP glagolima kako bismo odgovorili kada Klijent pošalje zahtjev na krajnju točku poslužitelja 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/')
Stvorili smo dva resursa pod nazivom Pjesme i Pjesme podklasiranjem Abstraktna klasa resursa Flask-RESTful. Predmet pod nazivom Pjesme ima dvije metode get i post koje odgovaraju dvama HTTP glagolima; GET, odnosno POST.
pitanja službe za pomoć korisnicima
Resurs Pjesme služi svim pjesmama registriranoj krajnjoj točki kada to Klijent zatraži i dodaje pjesmu na popis postojećih pjesama kada su podaci objavljeni na istoj krajnjoj točki.
Slično tome, u slučaju klase Song, HTTP GET, DELETE i PUT implementirani su metodama get, delete i put. Metoda get šalje odgovor sa zatraženom pjesmom kao JSON, metoda brisanja uklanja pjesmu iz PJESAMA, a metoda met ažurira postojeću pjesmu u PJESAMI.
Sad ćemo dodati ove resurse u naš uzorak aplikacije inicijalizacijom u datoteci __init__.py u mapi aplikacije.
from . import api
Instalirajmo curl i isprobajmo značajke na navedenim krajnjim točkama.
sudo apt -y install curl
Nabavite sve pjesme
curl -k https://localhost:8080/api/v1/songs
Dobivamo odgovor, kao što je prikazano u nastavku.
{ 'songs': { 'Song1': { 'title': 'Past Life', 'singer': 'Selena Gomez' } } }
Sada upotrijebimo dolje spomenutu naredbu za dodavanje pjesme.
curl -k -d 'title=Summer Days&singer=Martin Garrix' https://localhost:8080/api/v1/songs
Odgovor dobivamo od našeg API-ja, kao što je prikazano u nastavku.
{ 'Song2': { 'title': 'Summer Days', 'singer': 'Martin Garrix2' } }
Sad opet, ako upitamo popis pjesama kao što smo to činili u prethodnoj naredbi, i dobit ćemo obje pjesme u odgovoru.
{ 'songs': { 'Song1': { 'title': 'Past Life', 'singer': 'Selena Gomez' }, 'Song2': { 'title': 'Summer Days', 'singer': 'Martin Garrix2' } } }
Slično tome, HTTP DELETE i PUT rade kako je predviđeno. Dodajmo nekoliko testova za Verziju v1 ovog Jednostavnog API-ja koji smo stvorili.
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
Sada pokrenite ove testove iz naredbenog retka, kao što je prikazano u nastavku.
pytest app/tests/test_api.py
Slično tome, možemo napisati testove za druge metode radi veće pokrivenosti.
Važno je napomenuti da pjesme koje smo dodali nastavljaju postojati kao dio jedinstvenog procesa u kojem je pokrenut razvojni poslužitelj. To znači da će se svi novi podaci izgubiti čim se postupak isključi.
Štoviše, zadatak stvaranja verzije v1 API-ja čini se suvišnim i drugačiji je od načina na koji smo spremali podatke u aplikaciju uz pomoć obrazaca i pogleda.
Obično implementacija RESTful API-ja zahtijeva dobivanje podataka od klijenata, marširanje između krajeva klijenta i poslužitelja i upornost uz pomoć modela baza podataka koje smo stvorili.
Štoviše, krajnje su točke osigurane za nenamjerne i izrađene ulaze.
Stoga preporučujemo da su gore navedeni primjeri samo za učenje koncepata i ograničenja REST arhitekture korištenjem HTTP metoda. Imajte na umu da je ovo samo jedan od mnogih načina stvaranja web usluga. Štoviše, postoji mnogo načina na koje se REST arhitektura može implementirati.
Potičemo čitatelje da dodatno istraže kako REST može imati različite formate datoteka i prilagođene metode koristeći druge protokole, a ne samo JSON i HTTP. Da bismo uvidjeli samo jednu proizvodnu uporabu, donosimo primjer u nastavku.
Koristimo Flask-Appbuilder BaseApi za implementaciju sličnih značajki u različitim krajnjim točkama. Otvorite datoteku api.py i ažurirajte je dolje spomenutim kodom.
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)
Ajmo sada dodati još nekoliko testova za testiranje krajnjih točaka izrađenih pomoću Flask-Appbuilder. Te ćemo testove pokrenuti pomoću 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 također pomaže u pružanju Swagger korisničkog sučelja za popis i isprobavanje objavljenog API-ja. Otvorite config.py i ažurirajte ga konfiguracijom prikazanom u nastavku.
FAB_API_SWAGGER_UI=True
Sada idite na https: // localhost: 8080 / swaggerview / v1 i moći ćete vidjeti prikaz Swagger kako je prikazano dolje.
Ajmo sada stvoriti API-je za postojeće modele baza podataka koje imamo. Moramo koristiti ModelApi Flask-App Builder-a.
Ažurirajte datoteku api.py sljedećim retcima koda.
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)
Nakon definiranja klase temeljene na ModelRestApi, opet je trebamo registrirati u Flask-Appbuilderu pomoću metode add_api.
Sada prijeđite na Swagger UI kao i ranije i vidjet ćete API referencu sličnu onoj prikazanoj u nastavku.
Možete isprobati API iz prikaza Swagger ili slanjem uvojka na krajnje točke kao ranije.
API tikvice
Flask API je okvir koji je prilično sličan Django REST okviru. Možete pristupiti dokumentaciji Flask API-ja ovdje . To je zamjenska zamjena za okvir Flask.
Možemo odabrati bilo koji od gore danih primjera kako bismo u našu aplikaciju implementirali značajke vođene API-om Flask REST.
Ajmo sada založiti izvor i objaviti promjene u repo izvoru koristeći Git. Čim se posvetimo izvoru s imenom podružnice i pošaljemo zahtjev za povlačenjem, jedinični testovi automatski će se pokrenuti pod Git akcijama kao dio provjera zahtjeva za povlačenjem.
Boca RestPlus
Flask RestPlus je još jedno proširenje Flask-a koje pomaže u stvaranju REST API-ja pomoću Flaska. Ovaj je projekt rastavljen u drugo proširenje nazvano Flask-RESTX i više se ne održava.
Ovaj projekt ima dobru kolekciju dekoratera koji opisuju API-je i izlaže njegovu dokumentaciju pomoću Swaggera. Možete provjeriti detalje ovog projekta ovdje .
Često postavljana pitanja
P # 1) Kako mogu stvoriti REST API pomoću tikvice?
Odgovor: Okvir Flask možemo koristiti s drugim proširenjima Flask-a, poput Flask-RESTful, Flask API, Flask RESTX, Connexion, itd. Za stvaranje web aplikacija temeljenih na REST API-ju. Većina proširenja radi s ostalim ugrađenim značajkama okvira Flask i bilo kojim drugim postojećim ORM / knjižnicama.
P # 2) Što je primjer REST API-ja?
Odgovor: Primjer aplikacije koja implementira RESTFul API dan je u ovom vodiču. Flask-RESTful je korišten za stvaranje uzorka aplikacije. Pročitajte o odjeljku Primjer tikvice RESTful u ovom vodiču.
P # 3) Čemu služi RESTful API?
Odgovor: Sučelje aplikacijskog programiranja koje obično koristi HTTP zahtjeve i ima odgovarajuće pozadinske metode za HTTP glagole kao što su GET, POST, PUT itd. Kako bi se omogućila komunikacija između klijenta i poslužitelja naziva se RESTful API.
c i c ++ pitanja za intervju
Takva aplikacija slijedi načela i ograničenja REST arhitekture kako bi implementirala svoje značajke.
Zaključak
Pojmove proširenja Flask pokrili smo uz pomoć tri proširenja, poput Flask-twitter-oembedder, Flask API i Flask-RESTful.
Uz pomoć Flask-twitter-oembedder, pokrili smo i koncepte Twitter API-ja. Općenito, uključili smo i ideje o implementaciji RESTful web usluge koja slijedi principe i ograničenja REST arhitekture.
U našem sljedećem vodiču pokrivat ćemo usporedbu između Djanga i Flask framework-a kako bismo čitateljima pomogli razumjeti snage i slabosti oba okvira. Također će pomoći u odabiru jednog okvira u odnosu na drugi na temelju određenih projektnih zahtjeva.
=> Ovdje istražite jednostavnu seriju obuka za tikvice
Preporučena literatura
- Vodič za API testiranje: Cjelovit vodič za početnike
- Vodič za API za odmor: REST API arhitektura i ograničenja
- Vodič za Parasoft SOAtest: Alat za testiranje API-ja bez skripti
- Kako stvoriti API dokumentaciju u poštaru?
- Vodič za GitHub REST API - Podrška za REST API u GitHubu
- Kako koristiti poštara za testiranje različitih formata API-ja?
- Vodič za POSTMAN: API ispitivanje pomoću POSTMAN-a
- Top 31 popularna pitanja za intervju s Python tikvicom s odgovorima