flask api tutorial with example extending flask with apis
Aquest tutorial de l'API Flask explica les extensions populars de Flask com Flask twitter Oembedder, Flask API i Flask RESTful amb exemples:
El marc Flask té un nombre d’extensions força abundant. Aquestes extensions són força útils i són fàcils de desenvolupar. Sabem que el framework Flask és molt pitònic i té un conjunt mínim d’APIs i és molt flexible, per això la comunitat Flask ha creat tantes extensions per a moltes tasques específiques.
Com a part de la sèrie de tutorials de Flask, aquest tutorial té un exemple d'algunes extensions de Flask. Parlarem de les següents extensions.
- Flask twitter Oembedder
- API Flask
- Flascó RESTful
=> Visiteu aquí per aprendre Flask des de zero
Tot i que hem comentat moltes extensions com a part dels nostres tutorials anteriors, aquest tutorial explica més amb la perspectiva d’examinar els components d’una extensió Flask.
Què aprendreu:
Què és una extensió de matràs
Una extensió de flask és un mòdul Python instal·lable o un paquet que implementa funcionalitats addicionals a una aplicació de Flask. Una extensió de Flask pot ser tan senzilla com la que afegeix suport per consumir una API externa com Twitter per incrustar un tuit en una pàgina web.
O bé, una extensió de Flask pot ser un nou marc, com ara Flask API o Flask-RESTful, per crear aplicacions que segueixin un patró arquitectònic o un paradigma de desenvolupament.
Flask twitter Oembedder
En aquesta secció, prenem l'exemple d'un projecte senzill de codi obert existent aquí
Cloneu aquest projecte a la vostra màquina local i instal·leu-lo amb pip amb l'ajut de l'ordre esmentada a continuació.
# in an activated virtual environment pip install -e flask_twitter_oembedder/
Aquesta extensió ajuda a inserir un tuit amb l'ajuda d'una etiqueta de plantilla Jinja2. Tot i això, per utilitzar aquesta extensió, haureu de sol·licitar un compte de desenvolupador a Twitter. Un cop obtingueu un compte de desenvolupador, creeu una aplicació i obtindreu claus i secrets per consumir l'API de Twitter.
llocs web per descarregar vídeos de youtube
Un cop tingueu les claus i els secrets, emmagatzemeu-los en un lloc segur perquè l’aplicació hi pugui accedir. Hem conservat les variables de l'entorn i les hem afegit a la configuració de l'aplicació Flask, tal com es mostra a continuació. La nostra aplicació de demostració manté els valors de configuració al fitxer 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)
Obtenim els valors de les variables requerides de les variables d’entorn. Si el valor corresponent no està present a la variable d'entorn, s'emmagatzema com a Cap.
Un cop afegiu les línies anteriors al fitxer de configuració, aneu a __init__.py de l'aplicació Flask i inicialitzeu-la modificant-la, tal com es mostra a continuació.
from flask_caching import Cache from flask_twitter_oembedder import TwitterOEmbedder cache = Cache(app, config={'CACHE_TYPE': 'simple'}) twitter_oembedder = TwitterOEmbedder(app, cache)
Aquestes línies inicialitzaran l'extensió Flask. Ara podem modificar hello.html a les plantilles i afegir l’etiqueta esmentada a continuació, tal com es mostra a continuació.
{{ oembed_tweet('1277228221394587649') }}
Hem afegit aquesta etiqueta abans del bucle for a la plantilla existent. Aquest dígit molt llarg és l’identificador del tuit. Obtenim aquest identificador de l'URL del tuit després de tuitejar. Després de desar el fitxer de plantilla, anem al punt final / hello / greetings i rebem els resultats, tal com es mostra a la imatge següent.
Flascó RESTful
La nostra aplicació d’exemple Flask RESTful és la que respecta les restriccions de l’arquitectura REST. Tanmateix, no és com un protocol i els desenvolupadors són flexibles mentre implementen funcions, seguint les restriccions REST.
Llegiu més informació sobre les restriccions de l'arquitectura REST aquí .
Les modernes aplicacions web permeten als clients sol·licitar els recursos en punts finals fàcils de llegir i estables d’una manera sense estat.
Flask RESTful Exemple
Implantem algunes funcions d'una manera RESTful a la nostra aplicació d'exemple Flask RESTful.
Tenim una manera d’emmagatzemar i publicar dades relacionades amb àlbums i cançons. Implantem una API mitjançant l'extensió Flask RESTful.
Primer, instal·leu Flask RESTful mitjançant l'ordre següent.
preguntes i respostes d’entrevistes de fases de dades per a persones experimentades
pip install flask-restful
Per facilitar el manteniment i la comprensió, creem un fitxer anomenat api.py dins del directori de l'aplicació i esmentem les línies de codi següents. De moment, tingueu en compte les API similars a Flask Views.
Implementarem funcions corresponents als verbs HTTP per respondre quan el client enviï una sol·licitud al punt final del servidor de l’aplicació.
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/')
Hem creat dos recursos anomenats Cançons i cançons subclassant la classe abstracta de recursos de Flask-RESTful. La classe anomenada Cançons té dos mètodes get and post corresponents als dos verbs HTTP; GET i POST, respectivament.
El recurs Cançons serveix totes les cançons al punt final registrat quan el client ho sol·licita i afegeix una cançó a la llista de cançons existents quan les dades es publiquen al mateix punt final.
De la mateixa manera, en el cas de la classe Song, HTTP GET, DELETE i PUT s’implementen utilitzant els mètodes get, delete i put. El mètode get envia una resposta amb la cançó sol·licitada com a JSON, el mètode de supressió elimina una cançó de SONGS i el mètode put actualitza una cançó existent a SONGS.
Ara, afegim aquests recursos a la nostra aplicació de mostra inicialitzant-los al fitxer __init__.py a la carpeta de l'aplicació.
from . import api
Instal·lem curl i provem les funcions dels punts finals indicats.
sudo apt -y install curl
Obteniu totes les cançons
curl -k https://localhost:8080/api/v1/songs
Obtenim la resposta, com es mostra a continuació.
{ 'songs': { 'Song1': { 'title': 'Past Life', 'singer': 'Selena Gomez' } } }
Ara fem servir l'ordre esmentada a continuació per afegir una cançó.
curl -k -d 'title=Summer Days&singer=Martin Garrix' https://localhost:8080/api/v1/songs
Obtenim la resposta de la nostra API, tal com es mostra a continuació.
{ 'Song2': { 'title': 'Summer Days', 'singer': 'Martin Garrix2' } }
De nou, si consultem la llista de cançons tal com vam fer a l'ordre anterior, i obtindrem les dues cançons a la resposta.
{ 'songs': { 'Song1': { 'title': 'Past Life', 'singer': 'Selena Gomez' }, 'Song2': { 'title': 'Summer Days', 'singer': 'Martin Garrix2' } } }
De la mateixa manera, HTTP DELETE i PUT funcionen de la manera prevista. Afegim algunes proves per a la versió v1 d'aquesta API simple que hem 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
Ara executeu aquestes proves des de la línia d'ordres, com es mostra a continuació.
pytest app/tests/test_api.py
De la mateixa manera, podem escriure proves per a altres mètodes per obtenir més cobertura.
Una cosa important a tenir en compte és que les cançons que hem afegit persisteixen com a part del procés únic en què s’executa el servidor de desenvolupament. Vol dir que es perdran totes les dades noves tan aviat com es tanqui el procés.
A més, la tasca de crear la versió v1 de l'API sembla redundant i és diferent de la forma en què guardàvem dades a l'aplicació amb l'ajut de formularis i visualitzacions.
Normalment, la implementació de l'API RESTful requereix obtenir dades dels clients, dividir entre els extrems del client i el servidor i persistir amb l'ajuda dels models de base de dades que hem creat.
A més, els punts finals estan assegurats per a entrades involuntàries i elaborades.
Per tant, es recomana que els exemples anteriors siguin només per aprendre els conceptes i les restriccions de l'arquitectura REST mitjançant mètodes HTTP. Recordeu que aquesta és només una de les moltes maneres de crear serveis web, en general. A més, hi ha moltes maneres en què es pot implementar l'arquitectura REST.
Animem els lectors a explorar més a fons com REST pot tenir diferents formats de fitxers i mètodes personalitzats mitjançant altres protocols i no només JSON i HTTP. Només per fer un cop d'ull a un ús de la producció, proporcionem l'exemple següent.
Utilitzem un Flask-Appbuilder BaseApi per implementar funcions similars en diferents punts finals. Obriu el fitxer api.py i actualitzeu-lo amb el codi esmentat a continuació.
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)
Afegim ara algunes proves més per provar els punts finals que es construeixen amb Flask-Appbuilder. Executarem aquestes proves amb 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 també ajuda a proporcionar la interfície d’usuari Swagger per llistar i provar l’API publicada. Obriu config.py i actualitzeu-lo amb la configuració que es mostra a continuació.
FAB_API_SWAGGER_UI=True
Ara aneu a https: // localhost: 8080 / swaggerview / v1 i podreu veure la vista Swagger com es mostra a continuació.
Ara creem API per als models de base de dades existents que tenim. Hem d’utilitzar el ModelApi de Flask-Appbuilder.
Actualitzeu el fitxer api.py amb les línies de codi següents.
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)
Després de definir una classe basada en ModelRestApi, hem de tornar a registrar-la al Flask-Appbuilder mitjançant el mètode add_api.
Ara aneu a la interfície d’usuari Swagger com abans i veureu una referència d’API similar a la que es mostra a continuació.
Podeu provar l'API des de la vista Swagger o enviant el rínxol als punts finals com abans.
API Flask
Flask API és un framework bastant similar al framework Django REST. Podeu accedir a la documentació de l'API Flask aquí . És el substitut de la caixa del sistema Flask.
Podem triar qualsevol dels exemples anteriors per implementar les funcions basades en l'API Flask REST a la nostra aplicació.
Ara comprometem la font i publiquem els canvis a la reposició d’origen mitjançant Git. Tan bon punt ens comprometem amb l’origen amb el nom de la sucursal i enviem una sol·licitud d’extracció, les proves d’unitat s’activaran automàticament a Git Actions com a part de les comprovacions de sol·licitud d’extracció.
Flask RestPlus
Flask RestPlus és una extensió més de Flask que ajuda a la creació de l'API REST mitjançant Flask. Aquest projecte s'ha incorporat a una altra extensió anomenada Flask-RESTX i ja no es manté.
Aquest projecte té una bona col·lecció de decoradors per descriure les API i exposa la seva documentació mitjançant Swagger. Podeu consultar els detalls d’aquest projecte aquí .
Preguntes freqüents
P # 1) Com puc crear una API REST amb Flask?
Resposta: Podem utilitzar el marc Flask amb altres extensions Flask com Flask-RESTful, Flask API, Flask RESTX, Connexion, etc. per crear aplicacions web basades en API REST. La majoria de les extensions funcionen amb les altres funcions integrades del framework Flask i de qualsevol altra biblioteca ORM / biblioteca existent.
Q # 2) Què és un exemple d'API REST?
Resposta: En aquest tutorial es dóna un exemple d'aplicació que implementa l'API RESTFul. S'ha utilitzat Flask-RESTful per crear l'aplicació de mostra. Llegiu la secció d’exemple Flask RESTful d’aquest tutorial.
P # 3) Per a què serveix l'API RESTful?
Resposta: Una interfície de programació d'aplicacions que generalment utilitza sol·licituds HTTP i que té els mètodes corresponents de backend per a verbs HTTP com GET, POST, PUT, etc.
Error de referència indefinit de c ++
Aquesta aplicació segueix els principis i restriccions de l'arquitectura REST per implementar les seves característiques.
Conclusió
Hem tractat els conceptes d'extensions de Flask amb l'ajut de tres extensions, com Flask-twitter-oembedder, Flask API i Flask-RESTful.
Amb l'ajut de Flask-twitter-oembedder, també hem tractat els conceptes de l'API de Twitter. En general, també hem inclòs les idees d'implementar un servei web RESTful, que segueix els principis i restriccions de l'arquitectura REST.
En el nostre proper tutorial, tractarem la comparació entre el marc de Django i Flask per ajudar els nostres lectors a entendre els punts forts i els punts febles de tots dos marcs. També ajudarà a triar un marc contra l’altre en funció dels requisits específics del projecte.
=> Exploreu aquí la sèrie d'entrenament Simple Flask
Lectura recomanada
- Tutorial de proves API: una guia completa per a principiants
- Tutorial Rest API: Arquitectura i restriccions de l'API REST
- Parasoft SOAtest Tutorial: Eina de prova d'API sense script
- Com es crea documentació API a Postman?
- Tutorial de l'API REST de GitHub: suport de l'API REST a GitHub
- Com s'utilitza Postman per provar diferents formats d'API?
- Tutorial POSTMAN: proves d'API mitjançant POSTMAN
- Top 31 de les preguntes més populars de l'entrevista de Python Flask amb respostes