Costruire API RESTful con Flask l'approccio DIY

Trasferimento di stato rappresentativo (REST) è uno stile di progettazione dell'architettura di sviluppo Web che si riferisce alla separazione logica delle risorse API in modo da consentire un accesso, manipolazione e ridimensionamento semplici. I componenti riutilizzabili sono scritti in modo tale da poter essere facilmente gestiti tramite richieste HTTP semplici e intuitive che possono essere GET, POST, PUT, PATCH e DELETE (ce ne possono essere di più, ma sopra sono quelli più comunemente usati).

Nonostante quello che sembra, REST non comanda un protocollo o uno standard. Imposta semplicemente uno stile di architettura software per la scrittura di applicazioni Web e API e porta alla semplificazione delle interfacce all'interno e all'esterno dell'applicazione. Le API dei servizi Web che sono scritte in modo da seguire i principi REST, sono chiamate API RESTful.

In questa serie di tutorial in tre parti illustrerò diversi modi in cui è possibile creare API RESTful usando Flask come framework web. Nella prima parte illustrerò come creare le API REST basate sulla classe che sono più simili a Fai da te (Fai da te), cioè implementandole tutte da soli senza utilizzare estensioni di terze parti. Nelle ultime parti di questa serie, illustrerò come sfruttare varie estensioni di Flask per creare API REST più efficaci in un modo più semplice.

Presumo che tu abbia una conoscenza di base delle migliori pratiche di installazione di Flask e dell'ambiente usando virtualenv da seguire durante lo sviluppo di un'applicazione Python.

Installazione di dipendenze

I seguenti pacchetti devono essere installati per l'applicazione che svilupperemo.

$ pip installa flask $ pip installa flask-sqlalchemy

I comandi sopra riportati dovrebbero installare tutti i pacchetti richiesti necessari per far funzionare questa applicazione.

L'applicazione Flask

Per questo tutorial, creerò una piccola applicazione in cui creerò un modello banale per Prodotto. Quindi dimostrerò come possiamo scrivere un'API RESTful per lo stesso. Di seguito è riportata la struttura dell'applicazione.

flask_app / my_app / - __init__.py product / - __init__.py // File vuoto - models.py - views.py - run.py

Non creerò un front-end per questa applicazione poiché gli endpoint RESTful API possono essere testati direttamente effettuando chiamate HTTP utilizzando vari altri metodi.

flask_app / my_app / __ init__.py

da flask import Flask da flask.ext.sqlalchemy import SQLAlchemy app = Flask (__ name__) app.config ['SQLALCHEMY_DATABASE_URI'] = 'sqlite: ////tmp/test.db' db = SQLAlchemy (app) da my_app.catalog .views import catalogo catalog.register_blueprint (catalogo) db.create_all ()

Nel file sopra, l'applicazione è stata configurata con l'inizializzazione delle estensioni e infine la creazione del database. L'ultima istruzione crea un nuovo database nella posizione fornita contro SQLALCHEMY_DATABASE_URI se un database non esiste già in quella posizione, altrimenti carica l'applicazione con lo stesso database.

flask_app / my_app / Catalogo / models.py

da my_app import db class Product (db.Model): id = db.Column (db.Integer, primary_key = True) name = db.Column (db.String (255)) price = db.Column (db.Float (asdecimal = True)) def __init __ (self, name, price): self.name = nome self.price = price def __repr __ (self): return ''% self.id

Nel file qui sopra, ho creato un modello molto banale per la memorizzazione del nome e del prezzo di a Prodotto. Questo creerà un tavolo in SQLite corrispondente ai dettagli forniti nel modello.

flask_app / my_app / Catalogo / views.py

importare json da flask.views import, jsonify, Blueprint, abort from flask.views importare MethodView da my_app import db, app da my_app.catalog.models import Catalogo prodotti = Blueprint ('catalog', __name__) @ catalog.route ('/' ) @ catalog.route ('/ home') def home (): restituisce "Benvenuti nella home page del catalogo". class ProductView (MethodView): def get (self, id = None, page = 1): se non id: products = Product.query.paginate (pagina, 10) .items res =  per prodotto in prodotti: res [prodotto .id] = 'name': product.name, 'price': str (product.price), else: product = Product.query.filter_by (id = id) .first () se non prodotto: abort (404 ) res = 'name': product.name, 'price': str (product.price), restituisce jsonify (res) def post (self): name = request.form.get ('name') price = request .form.get ('price') product = Prodotto (nome, prezzo) db.session.add (prodotto) db.session.commit () restituisce jsonify (product.id: 'name': product.name, ' prezzo ': str (product.price),) def put (self, id): # Aggiorna il record per l'ID fornito # con i dettagli forniti. return def delete (self, id): # Elimina il record per l'ID fornito. return product_view = ProductView.as_view ('product_view') app.add_url_rule ('/ product /', view_func = product_view, methods = ['GET', 'POST']) app.add_url_rule ('/ product /', view_func = product_view, methods = [' GET ']))

Il punto cruciale di questo tutorial è trattato nel file qui sopra. Flask fornisce un'utilità chiamata viste a innesto, che consente di creare viste sotto forma di classi anziché normalmente come funzioni. Dispacciamento basato su metodi (MethodView) è un'implementazione di viste inseribili che consente di scrivere metodi corrispondenti ai metodi HTTP in lettere minuscole. Nell'esempio sopra, ho scritto metodi ottenere() e inviare() corrispondente a HTTP OTTENERE e INVIARE rispettivamente.

Il routing viene anche implementato in un modo diverso, nelle ultime righe del file precedente. Possiamo specificare i metodi che saranno supportati da qualsiasi regola particolare. Qualsiasi altra chiamata HTTP sarebbe soddisfatta da Errore 405 Metodo non consentito.

Esecuzione dell'applicazione

Per eseguire l'applicazione, eseguire lo script run.py. I contenuti di questo script sono:

dall'app di importazione my_app app.run (debug = True)

Ora esegui dalla riga di comando:

$ python run.py

Per verificare se l'applicazione funziona, avviare http://127.0.0.1:000/000 nel browser e una schermata semplice con un messaggio di benvenuto dovrebbe darti il ​​benvenuto.

Test dell'API RESTful

Per testare questa API, possiamo semplicemente effettuare chiamate HTTP usando uno dei tanti metodi disponibili. È possibile effettuare chiamate direttamente tramite il browser. Le chiamate POST possono essere effettuate utilizzando un'estensione di Chrome come Postman o utilizzando la riga di comando arricciare, oppure possiamo usare Python richieste biblioteca per fare il lavoro per noi. Userò qui la libreria delle richieste a scopo dimostrativo.

Facciamo un OTTENERE chiama prima per assicurarti che non abbiamo ancora nessun prodotto creato. Come da progettazione dell'API RESTful, una chiamata get che assomiglia a qualcosa /Prodotto/ dovrebbe elencare tutti i prodotti. Quindi creerò un paio di prodotti creando INVIARE chiama a /Prodotto/ con alcuni dati. Poi un OTTENERE chiama a /Prodotto/ dovrebbe elencare tutti i prodotti creati. Per recuperare un prodotto specifico, a OTTENERE chiama a /Prodotto/ dovrebbe fare il lavoro Di seguito è riportato un esempio di tutte le chiamate che è possibile effettuare utilizzando questo esempio.

$ pip installa richieste $ python >>> richieste di importazione >>> r = requests.get ('http: // localhost: 5000 / product /') >>> r.json ()  >>> r = richieste. post ('http: // localhost: 5000 / product /', data = 'name': 'iPhone 6s', 'price': 699) >>> r.json () u'1 ': u 'prezzo': u'699,0000000000 ', u'name': u'iPhone 6s ' >>> r = requests.post (' http: // localhost: 5000 / product / ', data = ' name ': 'iPad Pro', 'prezzo': 999) >>> r.json () u'2 ': u'price': u'999.0000000000 ', u'name': u'iPad Pro '> >> r = requests.get ('http: // localhost: 5000 / product /') >>> r.json () u'1 ': u'price': u'699.0000000000 ', u'name' : u'iPhone 6s ', u'2': u'price ': u'999.0000000000', u'name ': u'iPad Pro' >>> r = requests.get ('http: // localhost: 5000 / product / 1 ') >>> r.json () u'price': u'699.0000000000 ', u'name': u'iPhone 6s '

Conclusione

In questo tutorial, hai visto come creare interfacce RESTful da solo utilizzando l'utilità di visualizzazione pluggable di Flask. Questo è l'approccio più flessibile mentre si scrivono le API REST ma richiede molto più codice da scrivere. 

Esistono estensioni che semplificano la vita e automatizzano l'implementazione di API RESTful in misura enorme. Ne parlerò nel prossimo paio di parti di questa serie di tutorial.