flask api tutorial with example extending flask with apis
Acest tutorial API Flask explică extensiile populare Flask precum Flask twitter Oembedder, Flask API și Flask RESTful cu exemple:
Cadrul Flask are un număr destul de abundent de extensii. Aceste extensii sunt destul de utile și sunt ușor de dezvoltat. Știm că cadrul Flask este foarte pitonic și are un set minim de API-uri și este foarte flexibil, motiv pentru care comunitatea Flask a creat atât de multe extensii pentru multe sarcini specifice.
Ca parte a seriei de tutoriale Flask, acest tutorial are un exemplu de câteva extensii Flask. Vom discuta despre următoarele extensii.
- Flask twitter Oembedder
- API Flask
- Balon RESTful
=> Vizitați aici pentru a afla balonul de la zero
Deși am discutat despre multe extensii ca parte a tutorialelor noastre anterioare, acest tutorial explică mai multe cu perspectiva examinării componentelor unei extensii Flask.
Ce veți învăța:
Ce este o extensie a balonului
O extensie balon este un modul Python instalabil sau un pachet care implementează funcționalități suplimentare unei aplicații Flask. O extensie Flask poate fi la fel de simplă ca cea care adaugă suport pentru consumul unui API extern, cum ar fi Twitter, pentru a încorpora un tweet pe o pagină web.
Sau, o extensie Flask ar putea fi un cadru nou, cum ar fi Flask API sau Flask-RESTful pentru a construi aplicații care urmează un model arhitectural sau o paradigmă de dezvoltare.
Flask twitter Oembedder
În această secțiune, luăm exemplul unui proiect simplu open-source existent din Aici
Clonați acest proiect în mașina dvs. locală și instalați-l folosind pip cu ajutorul comenzii menționate mai jos.
# in an activated virtual environment pip install -e flask_twitter_oembedder/
Această extensie ajută la încorporarea unui Tweet cu ajutorul unei etichete șablon Jinja2. Cu toate acestea, pentru a utiliza această extensie, va trebui să solicitați un cont de dezvoltator la Twitter. După ce obțineți un cont de dezvoltator, creați o aplicație și veți primi chei și secrete pentru a consuma API-ul Twitter.
cum se deschid fișiere XML în word
Odată ce ai cheile și secretele, stochează-le într-un loc sigur, astfel încât aplicația să le poată accesa. Le-am păstrat în variabilele de mediu și le-am adăugat la configurația aplicației Flask, așa cum se arată mai jos. Aplicația noastră demonstrativă păstrează valorile de configurare în fișierul 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)
Obținem valorile variabilelor necesare din variabilele de mediu. Dacă valoarea corespunzătoare nu este prezentă în variabila de mediu, atunci aceasta este stocată ca None.
După ce adăugați liniile de mai sus în fișierul de configurare, accesați __init__.py al aplicației Flask și inițializați-l modificându-l, așa cum se arată mai jos.
from flask_caching import Cache from flask_twitter_oembedder import TwitterOEmbedder cache = Cache(app, config={'CACHE_TYPE': 'simple'}) twitter_oembedder = TwitterOEmbedder(app, cache)
Aceste linii vor inițializa extensia Flask. Acum putem modifica hello.html sub șabloane și adăuga eticheta menționată mai jos așa cum se arată mai jos.
{{ oembed_tweet('1277228221394587649') }}
Am adăugat această etichetă înainte de bucla for din șablonul existent. Această cifră foarte lungă este id-ul tweet-ului. Obținem acest id de la adresa URL a Tweet-ului după tweeting. După salvarea fișierului șablon, navigăm la punctul final / hello / greetings și primim rezultatele, așa cum se arată în imaginea de mai jos.

Balon RESTful
Aplicația noastră de exemplu Flask RESTful este cea care respectă constrângerile arhitecturii REST. Cu toate acestea, nu este ca un protocol, iar dezvoltatorii sunt flexibili în timp ce implementează caracteristici, urmând constrângerile REST.
Vă rugăm să citiți mai multe despre constrângerile arhitecturii REST Aici .
Aplicațiile web moderne permit clienților să solicite resursele la puncte finale ușor de citit și stabile într-o manieră apatridă.
Flask RESTful Exemplu
Să implementăm câteva caracteristici într-o manieră RESTful și în exemplul nostru de aplicație Flask RESTful.
Avem o modalitate de stocare și servire a datelor legate de albume și melodii. Să implementăm un API folosind extensia Flask RESTful.
Mai întâi, instalați Flask RESTful folosind comanda de mai jos.
pip install flask-restful
Pentru întreținere și înțelegere ușoară, permiteți-ne să creăm un fișier numit api.py în directorul aplicației și să menționăm următoarele linii de cod în acesta. Deocamdată, luați în considerare API-uri similare cu Flask Views.
Vom implementa caracteristici corespunzătoare verbelor HTTP pentru a răspunde atunci când Clientul trimite o cerere către punctul final Server al aplicației.
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/')
Am creat două resurse numite Melodii și melodii, subclasând clasa abstractă Resurse Flask-RESTful. Clasa numită Cântece are două metode get și post corespunzătoare celor două verbe HTTP; GET și, respectiv, POST.
Resursa Melodii servește toate melodiile către punctul final înregistrat atunci când Clientul o solicită și adaugă o melodie la lista melodiilor existente atunci când datele sunt postate la același punct final.
În mod similar, în cazul clasei Song, HTTP GET, DELETE și PUT sunt implementate folosind metodele get, delete și put. Metoda get trimite un răspuns cu melodia cerută ca JSON, metoda șterge elimină o melodie din SONGS, iar metoda put actualizează o melodie existentă în SONGS.
Acum, permiteți-ne să adăugăm aceste resurse la aplicația noastră eșantion, inițializându-le în fișierul __init__.py din dosarul aplicației.
from . import api
Să instalăm curl și să încercăm caracteristicile de pe punctele finale indicate.
sudo apt -y install curl
Obține toate melodiile
curl -k https://localhost:8080/api/v1/songs
Primim răspunsul, așa cum se arată mai jos.
{ 'songs': { 'Song1': { 'title': 'Past Life', 'singer': 'Selena Gomez' } } }
Acum, să folosim comanda menționată mai jos pentru a adăuga o melodie.
curl -k -d 'title=Summer Days&singer=Martin Garrix' https://localhost:8080/api/v1/songs
Primim răspunsul de la API-ul nostru, așa cum se arată mai jos.
{ 'Song2': { 'title': 'Summer Days', 'singer': 'Martin Garrix2' } }
Din nou, dacă interogăm lista de melodii așa cum am făcut în comanda anterioară și vom primi ambele melodii în răspuns.
{ 'songs': { 'Song1': { 'title': 'Past Life', 'singer': 'Selena Gomez' }, 'Song2': { 'title': 'Summer Days', 'singer': 'Martin Garrix2' } } }
În mod similar, HTTP DELETE și PUT funcționează conform intenției. Să adăugăm câteva teste pentru versiunea v1 a acestui API simplu pe care l-am creat.
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
Acum executați aceste teste din linia de comandă, așa cum se arată mai jos.
cum se inițializează o matrice generică în java
pytest app/tests/test_api.py
În mod similar, putem scrie teste pentru alte metode pentru o mai mare acoperire.
Un lucru important de menționat este că melodiile pe care le-am adăugat persistă ca parte a procesului unic în care rulează serverul de dezvoltare. Înseamnă că toate datele noi se vor pierde de îndată ce procesul se va opri.
Mai mult, sarcina de a crea versiunea v1 a API-ului pare redundantă și este diferită de modul în care salvam date în aplicație cu ajutorul formularelor și vizualizărilor.
De obicei, implementarea API-ului RESTful necesită obținerea de date de la clienți, asocierea dintre capetele clientului și server și persistența cu ajutorul modelelor de baze de date pe care le-am creat.
Mai mult, punctele finale sunt securizate pentru intrări neintenționate și create.
Prin urmare, vă recomandăm ca exemplele date mai sus să fie doar pentru învățarea conceptelor și constrângerilor arhitecturii REST folosind metode HTTP. Vă rugăm să rețineți că acesta este doar unul dintre numeroasele moduri de creare a serviciilor web, în general. Mai mult, există multe moduri în care arhitectura REST poate fi implementată.
Îi încurajăm pe cititori să exploreze în continuare modul în care REST poate avea diferite formate de fișiere și metode personalizate folosind alte protocoale și nu numai JSON și HTTP. Doar pentru a vedea o singură utilizare a producției, oferim exemplul de mai jos.
Folosim un Flask-Appbuilder BaseApi pentru a implementa caracteristici similare sub diferite puncte finale. Deschideți fișierul api.py și actualizați-l cu codul menționat mai jos.
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)
Acum să adăugăm câteva teste pentru a testa punctele finale construite folosind Flask-Appbuilder. Vom rula aceste teste folosind 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 ajută, de asemenea, la furnizarea interfeței Swagger pentru listarea și încercarea API-ului publicat. Deschideți config.py și actualizați-l cu configurația prezentată mai jos.
FAB_API_SWAGGER_UI=True
Navigați acum la https: // localhost: 8080 / swaggerview / v1 și veți putea vedea vizualizarea Swagger așa cum se arată mai jos.

Acum să creăm API-uri pentru modelele de baze de date existente pe care le avem. Trebuie să folosim ModelApi al Flask-Appbuilder.
Actualizați fișierul api.py cu următoarele linii de cod.
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)
După definirea unei clase bazate pe ModelRestApi, trebuie din nou să o înregistrăm la Flask-Appbuilder folosind metoda add_api.
Navigați acum la Swagger UI ca mai devreme și veți vedea o referință API similară cu cea prezentată mai jos.

Puteți încerca API-ul din vizualizarea Swagger sau trimițând bucla către punctele finale ca mai devreme.
API Flask
Flask API este un cadru care este destul de similar cu cadrul Django REST. Puteți accesa documentația API Flask Aici . Este înlocuitorul drop-in pentru cadrul Flask.
Putem alege oricare dintre exemplele date mai sus pentru a implementa caracteristicile Flask REST API conduse în aplicația noastră.
Acum să comitem sursa și să publicăm modificările la repo originala folosind Git. De îndată ce ne angajăm la origine cu numele sucursalei și trimitem o cerere de extragere, testele unitare se vor declanșa automat în cadrul Acțiunilor Git ca parte a verificărilor cererii de extragere.
Sticlă RestPlus
Flask RestPlus este încă o extensie Flask care ajută la crearea REST API folosind Flask. Acest proiect a fost introdus într-o altă extensie numită Flask-RESTX și nu mai este întreținut.
Acest proiect are o bună colecție de decoratori pentru a descrie API-urile și își expune documentația folosind Swagger. Puteți verifica detaliile acestui proiect Aici .
întrebări frecvente
Q # 1) Cum creez un API REST cu Flask?
Răspuns: Putem utiliza cadrul Flask cu alte extensii Flask, cum ar fi Flask-RESTful, Flask API, Flask RESTX, Connexion etc. pentru a crea aplicații web bazate pe API REST. Majoritatea extensiilor funcționează cu celelalte caracteristici integrate ale cadrului Flask și cu orice alte ORM / biblioteci existente.
Q # 2) Ce este un exemplu REST API?
Răspuns: Un exemplu de aplicație care implementează API RESTFul este dat în acest tutorial. Flask-RESTful a fost folosit pentru a crea aplicația eșantion. Citiți despre secțiunea de exemplu Flask RESTful din acest tutorial.
Î # 3) Pentru ce este RESTful API?
Răspuns: O interfață de programare a aplicațiilor care utilizează în general cereri HTTP și are metode de backend corespunzătoare pentru verbe HTTP, cum ar fi GET, POST, PUT, etc.
cel mai bun registru gratuit pentru Windows 8.1
O astfel de aplicație respectă principiile și constrângerile arhitecturii REST pentru implementarea caracteristicilor sale.
Concluzie
Am acoperit conceptele de extensii Flask cu ajutorul a trei extensii, cum ar fi Flask-twitter-oembedder, Flask API și Flask-RESTful.
Cu ajutorul Flask-twitter-oembedder, am acoperit și conceptele Twitter API. În general, am inclus și ideile de implementare a unui serviciu web RESTful, care respectă principiile și constrângerile arhitecturii REST.
În următorul nostru tutorial, vom acoperi comparația dintre Django și cadrul Flask pentru a ne ajuta cititorii să înțeleagă punctele tari și punctele slabe ale ambelor cadre. De asemenea, va ajuta la alegerea unui cadru în raport cu celălalt pe baza cerințelor specifice ale proiectului.
=> Explorați aici seria de instruire a balonului simplu
Lectură recomandată
- Tutorial API de testare: un ghid complet pentru începători
- Tutorial API Rest: Arhitectură și constrângeri REST API
- Parasoft SOAtest Tutorial: Instrument de testare API fără script
- Cum se creează documentația API în Postman?
- GitHub REST API Tutorial - Asistență REST API în GitHub
- Cum se folosește Postman pentru testarea diferitelor formate API?
- Tutorial POSTMAN: Testare API folosind POSTMAN
- Top 31 Întrebări populare de interviu Python Flask cu răspunsuri