Costruire API RESTful con Flask un ORM con SQLAlchemy

Nella prima parte di questa serie di tutorial in tre parti, abbiamo visto come scrivere API RESTful da soli utilizzando Flask come framework web. L'approccio precedente offriva molta flessibilità, ma includeva anche la scrittura di un sacco di codice che altrimenti avrebbe potuto essere evitato in casi più generici. 

In questa parte, utilizzeremo un'estensione Flask, Flask-Restless, che genera semplicemente API RESTful per i modelli di database definiti con SQLAlchemy. Prenderò la stessa applicazione di esempio dell'ultima parte di questa serie per mantenere il contesto e la continuità.

Installazione di dipendenze

Continuando con l'applicazione dalla prima parte, è necessario installare solo una dipendenza:

$ pip installa Flask-Restless

L'applicazione

Flask-Restless rende l'aggiunta di interfacce API RESTful ai modelli scritti con SQLAlchemy un pezzo di torta. Innanzitutto, aggiungi il REST APIManager dal flask.ext.restless estensione al file di configurazione dell'applicazione.

flask_app / my_app / __ init__.py

da flask.ext.restless import APIManager manager = APIManager (app, flask_sqlalchemy_db = db)

Basta aggiungere il paio di linee sopra al codice esistente dovrebbe essere sufficiente.

flask_app / my_app / Catalogo / views.py

Questo file comprende la maggior parte delle modifiche dalla parte precedente. Di seguito è riportato il file riscritto completo.

dalla matrice importare Blueprint da my_app import manager da my_app.catalog.models import Product catalog = Blueprint ('catalog', __name__) @ catalog.route ('/') @ catalog.route ('/ home') def home (): torna "Benvenuti nella home page del catalogo". manager.create_api (Product, methods = ['GET', 'POST'])

È abbastanza auto-esplicativo come funzionerebbe il codice sopra. Abbiamo appena importato il manager è stato creato in un file precedente e viene utilizzato per creare un'API per il file Prodotto modello con la lista metodi. Possiamo aggiungere più metodi come ELIMINA, METTERE, PATCH, ecc. se necessario.

Applicazione in azione

Proviamo questa applicazione creando alcuni prodotti e elencandoli. L'endpoint creato da questa estensione per impostazione predefinita è http: // localhost: 5000 / api / prodotto.

Come ho fatto nell'ultima parte di questa serie di tutorial, metterò alla prova questo usando il richieste libreria via terminale.

>>> richieste di importazione >>> import json >>> res = requests.get ('http://127.0.0.1:5000/api/product') >>> res.json () u'total_pages ': 0 , u'objects ': [], u'num_results': 0, u'page ': 1 >>> d = ' nome ': u'iPhone', 'prezzo': 549.00 >>> res = richieste .post ('http://127.0.0.1:5000/api/product', data = json.dumps (d), header = 'Content-Type': 'application / json') >>> res.json () u'price ': 549.0, u'id': 1, u'name ': u'iPhone' >>> d = 'name': u'iPad ',' price ': 649.00 >> > res = requests.post ('http://127.0.0.1:5000/api/product', data = json.dumps (d), header = 'Content-Type': 'application / json')) >> > res.json () u'price ': 649.0, u'id': 2, u'name ': u'iPad' >>> res = requests.get ('http://127.0.0.1:5000 / api / product ') >>> res.json () u'total_pages': 1, u'objects ': [u'price': 549.0, u'id ': 1, u'name': u ' iPhone ', u'price': 649.0, u'id ': 2, u'name': u'iPad '], u'num_results': 2, u'page ': 1

Come personalizzare

È davvero utile avere le API RESTful create automaticamente, ma ogni applicazione ha una logica aziendale che richiede personalizzazioni, convalide e una gestione intelligente / sicura delle richieste in base alle esigenze. 

Qui, richiesta preprocessori e postprocessori vieni in soccorso Come indicano i nomi, i metodi designati come preprocessori vengono eseguiti prima dell'elaborazione della richiesta e i metodi designati come postprocessori vengono eseguiti dopo l'elaborazione della richiesta. create_api () è il luogo in cui sono definiti come dizionari del tipo di richiesta (OTTENERE, INVIARE, ecc.) ei metodi come elenco che fungeranno da preprocessori o postprocessori sulla richiesta specificata. Di seguito è riportato un esempio di modello:

manager.create_api (Product, methods = ['GET', 'POST', 'DELETE'], preprocessors = 'GET_SINGLE': ['a_preprocessor_for_single_get'], 'GET_MANY': ['another_preprocessor_for_many_get'], 'POST': [ 'a_preprocessor_for_post'], postprocessors = 'DELETE': ['a_postprocessor_for_delete'])) 

Il OTTENERE, METTERE, e PATCH le richieste hanno la flessibilità di essere licenziate per record singoli e multipli; quindi, hanno due tipi ciascuno. Nel codice sopra, avviso GET_SINGLE e GET_MANY per OTTENERE richieste. 

I preprocessori e i postprocessori accettano parametri diversi per ogni tipo di richiesta e funzionano senza alcun valore di ritorno. Questo è lasciato per te a provare da solo.

Conclusione

In questa parte di questa serie di tutorial, abbiamo visto come creare un'API RESTful utilizzando Flask semplicemente aggiungendo un paio di righe a un modello basato su SQLAlchemy. 

Nella prossima e ultima parte di questa serie, illustrerò come creare un'API RESTful usando un'altra estensione di Flask popolare, ma questa volta l'API sarà indipendente dallo strumento di modellazione utilizzato per il database.