RESTful API's bouwen met Flask een ORM met SQLAlchemy

In het eerste deel van deze drieledige instructiereeks hebben we gezien hoe we RESTful API's helemaal zelf kunnen schrijven met Flask als web framework. De vorige aanpak bood veel flexibiliteit, maar omvatte ook het schrijven van veel code die anders in meer algemene gevallen had kunnen worden vermeden. 

In dit deel gebruiken we een Flask-extensie, Flask-Restless, die eenvoudig RESTful API's genereert voor databasemodellen die zijn gedefinieerd met SQLAlchemy. Ik neem dezelfde voorbeeldapplicatie als in het laatste deel van deze serie om de context en continuïteit te behouden.

Afhankelijkheden installeren

Terwijl we doorgaan met de applicatie van het eerste deel, moeten we slechts één afhankelijkheid installeren:

$ pip install Flask-Restless

De applicatie

Kolf-Restless maakt het toevoegen van RESTful API-interfaces aan modellen geschreven met SQLAlchemy een fluitje van een cent. Voeg eerst de REST toe APIManager van de flask.ext.restless uitbreiding naar het toepassingsconfiguratiebestand.

flask_app / my_app / __ init__.py

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

Alleen het toevoegen van het bovenstaande paar regels aan de bestaande code zou voldoende moeten zijn.

flask_app / my_app / catalogus / views.py

Dit bestand bevat het grootste deel van de wijzigingen van het vorige deel. Hieronder staat het volledig herschreven bestand.

from flask import Blueprint van my_app import manager van my_app.catalog.models import Productcatalogus = Blueprint ('catalogus', __name__) @ catalog.route ('/') @ catalog.route ('/ home') def home (): terug "Welkom bij de Catalogus Home." manager.create_api (Product, methoden = ['GET', 'POST'])

Het is redelijk duidelijk hoe de bovenstaande code zou werken. We hebben zojuist het manager die in een vorig bestand is gemaakt en wordt gebruikt om een ​​API voor de te maken Artikel model met de lijst methoden. We kunnen meer methoden toevoegen zoals DELETE, LEGGEN, PATCH, etc. zoals nodig.

Toepassing in actie

Laten we deze applicatie testen door een aantal producten te maken en ze op te sommen. Het eindpunt dat standaard door deze extensie wordt gemaakt, is http: // localhost: 5000 / api / product.

Zoals ik deed in het laatste deel van deze tutorialserie, zal ik dit testen met behulp van de verzoeken bibliotheek via terminal.

>>> importeer aanvragen >>> 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 = ' name ': u'iPhone', 'price': 549.00 >>> res = verzoeken .post ('http://127.0.0.1:5000/api/product', data = json.dumps (d), headers = '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), headers = '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

Hoe aan te passen

Het is erg handig om de RESTful API's automatisch te laten maken, maar elke applicatie heeft bedrijfslogica die vraagt ​​om aanpassingen, validaties en slimme / veilige afhandeling van verzoeken als dat nodig is. 

Hier, verzoek preprocessors en postprocessoren kom te hulp. Zoals de namen betekenen, worden methoden die zijn aangemerkt als preprocessors, uitgevoerd vóór de verwerking van het verzoek en worden methoden die zijn aangewezen als postprocessors uitgevoerd na de verwerking van het verzoek. create_api () is de plaats waar ze worden gedefinieerd als woordenboeken van het verzoektype (KRIJGEN, POST, enz.) en de methoden als lijst die zullen fungeren als preprocessors of postprocessors op het gespecificeerde verzoek. Hieronder ziet u een voorbeeld van een sjabloon:

manager.create_api (Product, methoden = ['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']) 

De KRIJGEN, LEGGEN, en PATCH verzoeken hebben de flexibiliteit om te worden ontslagen voor afzonderlijke en meerdere records; daarom hebben ze elk twee typen. In de bovenstaande code, let op GET_SINGLE en GET_MANY voor KRIJGEN verzoeken. 

De preprocessors en postprocessors accepteren verschillende parameters voor elk type verzoek en werken zonder enige terugbetalingswaarde. Dit wordt aan u overgelaten om het zelf te proberen.

Conclusie

In dit deel van deze tutorialserie zagen we hoe een RESTful API te maken met behulp van Flask door gewoon een paar regels toe te voegen aan een SQLAlchemy-gebaseerd model. 

In het volgende en laatste deel van deze serie zal ik ingaan op het maken van een RESTful API met een andere populaire Flask-extensie, maar deze keer zal de API onafhankelijk zijn van de modelleertool die voor de database wordt gebruikt.