Bygg RESTful APIs med flaske en ORM med SQLAlchemy

I den første delen av denne tredelte opplæringsserien så vi hvordan du skriver RESTful APIer, alle av oss selv, ved hjelp av Flask som webrammen. Den forrige tilnærmingen ga en stor fleksibilitet, men inkluderte også å skrive mye kode som ellers kunne vært unngått i flere generiske tilfeller. 

I denne delen vil vi bruke en flaskutvidelse, Flask-Restless, som bare genererer RESTful APIer for databasemodeller definert med SQLAlchemy. Jeg vil ta samme prøveapplikasjon som i den siste delen av denne serien for å opprettholde kontekst og kontinuitet.

Installere avhengigheter

Mens du fortsetter med søknaden fra første del, må vi bare installere en avhengighet:

$ pip installasjon Flask-Restless

Søknaden

Flask-Rastløs gjør å legge til RESTful API grensesnitt til modeller skrevet med SQLAlchemy et stykke kake. Først legger du til REST APIManager fra flask.ext.restless utvidelse til programkonfigurasjonsfilen.

flask_app / my_app / __ init__.py

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

Bare å legge ovenstående par linjer til eksisterende kode skal være tilstrekkelig.

flask_app / my_app / Katalog / views.py

Denne filen består av hovedparten av endringene fra forrige del. Nedenfor er den komplette omskrivne filen.

fra kolbe import Blueprint fra my_app import manager fra my_app.catalog.models import Varekatalog = Blueprint ('katalog', __name__) @ catalog.route ('/') @ catalog.route ('/ home') def home (): returnere "Velkommen til katalogen Hjem." manager.create_api (Produkt, metoder = ['GET', 'POST'])

Det er ganske selvforklarende hvordan koden ovenfor ville fungere. Vi har nettopp importert sjef som ble opprettet i en tidligere fil, og den brukes til å opprette en API for Produkt modell med listen fremgangsmåter. Vi kan legge til flere metoder som SLETT, SETTE, LAPP, etc. etter behov.

Søknad i aksjon

La oss teste dette programmet ved å lage noen produkter og oppgi dem. Endpunktet som er opprettet av denne utvidelsen som standard er http: // localhost: 5000 / api / produkt.

Som jeg gjorde i den siste delen av denne opplæringsserien, vil jeg teste dette ved hjelp av forespørsler bibliotek via terminal.

>>> importforespørsler >>> 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 = ' navn ': u'iPhone', 'pris': 549.00 >>> res = forespørsler .post ('http://127.0.0.1:5000/api/product', data = json.dumps (d), overskrifter = 'Content-Type': 'application / json') >>> res.json () u'price ': 549.0, u'id': 1, navn ': u'iPhone' >>> d = 'navn': u'iPad ',' pris ': 649.00 >> > res = requests.post ('http://127.0.0.1:5000/api/product', data = json.dumps (d), overskrifter = 'Content-Type': 'application / json') >> > res.json () u'price ': 649.0, u'id': 2, navn ': u'iPad' >>> res = requests.get ('http://127.0.0.1:5000 / api / produkt ') >>> res.json () u'total_pages': 1, u'objects': [u'price': 549.0, u'id': 1, u'name': u ' iPhone ', u'price': 649.0, du'id ': 2, navn': u'iPad '], du er' resultatene ': 2, siden': 1

Slik tilpasser du

Det er veldig praktisk å ha de RESTful APIene opprettet automatisk, men hvert program har noen forretningslogikk som krever tilpassinger, valideringer og smart / sikker håndtering av forespørsler etter behov. 

Her, forespørsel preprocessors og postprocessors komme til redning. Som navnene betegner, kjører metoder som er utpekt som forprosessorer før behandling av forespørselen, og metoder utpekt som postprosessorer kjører etter behandling av forespørselen. create_api () er stedet der de er definert som ordbøker av forespørselstypen (, POST, etc.) og metodene som liste som vil fungere som forprosessorer eller postprosessorer på den angitte forespørselen. Nedenfor er et maleksempel:

manager.create_api (Produkt, metoder = ['GET', 'POST', 'DELETE'], preprocessors = 'GET_SINGLE': ['a_preprocessor_for_single_get'], 'GET_MANY': ['another_preprocessor_for_many_get'], 'POST': [ 'a_preprocessor_for_post'], postprocessorer = 'DELETE': ['a_postprocessor_for_delete']) 

De , SETTE, og LAPP forespørsler har fleksibiliteten til å bli fyret for single så vel som flere poster; derfor har de to typer hver. I koden ovenfor merker du GET_SINGLE og GET_MANY til forespørsler. 

Forprosessorer og postprosessorer godtar forskjellige parametere for hver type forespørsel og arbeid uten returverdi. Dette er igjen for deg å prøve på egenhånd.

Konklusjon

I denne delen av denne opplæringsserien så vi hvordan du lager et RESTful API ved hjelp av Flask bare ved å legge til et par linjer på en SQLAlchemy-basert modell. 

I neste og siste del av denne serien vil jeg dekke hvordan du lager et RESTful API ved hjelp av en annen populær Flask-utvidelse, men denne gangen vil API-en være uavhengig av modellverktøyet som brukes til databasen.