Construction d'API RESTful avec Flask un ORM avec SQLAlchemy

Dans la première partie de cette série de didacticiels en trois parties, nous avons vu comment écrire nous-mêmes des API RESTful en utilisant Flask comme infrastructure Web. L'approche précédente offrait beaucoup de flexibilité mais incluait également l'écriture de nombreux codes qui auraient autrement pu être évités dans des cas plus génériques.. 

Dans cette partie, nous utiliserons une extension Flask, Flask-Restless, qui génère simplement des API RESTful pour les modèles de base de données définis avec SQLAlchemy. Je prendrai le même exemple d’application que dans la dernière partie de cette série pour conserver le contexte et la continuité.

Installation de dépendances

Tout en continuant avec l'application de la première partie, nous n'avons besoin d'installer qu'une seule dépendance:

$ pip installer Flask-Restless

L'application

Flask-Restless facilite l'ajout d'interfaces d'API RESTful aux modèles écrits avec SQLAlchemy. Tout d'abord, ajoutez le reste APIManager du flask.ext.restless extension au fichier de configuration de l'application.

flask_app / my_app / __ init__.py

à partir de flask.ext.restless import APIManager manager = APIManager (app, flask_sqlalchemy_db = db)

Le simple ajout des quelques lignes ci-dessus au code existant devrait suffire.

flask_app / my_app / catalog / views.py

Ce fichier comprend l'essentiel des modifications de la partie précédente. Ci-dessous le fichier complet réécrit.

depuis l'importation de flacon Blueprint depuis le gestionnaire d'importation my_app depuis my_app.catalog.models import Catalogue de produits = Blueprint ('catalogue', __name__) @ catalog.route ('/') @ catalog.route ('/ home') def home (): retour "Bienvenue sur le catalogue Accueil." manager.create_api (Produit, méthodes = ['GET', 'POST'])

La manière dont le code ci-dessus fonctionnerait est assez explicite. Nous venons d'importer le directeur créé dans un fichier précédent et utilisé pour créer une API pour le Produit modèle avec la liste les méthodes. Nous pouvons ajouter plus de méthodes comme EFFACER, METTRE, PIÈCE, etc. au besoin.

Application en action

Testons cette application en créant des produits et en les listant. Le noeud final créé par cette extension par défaut est http: // localhost: 5000 / api / product.

Comme je l’ai fait dans la dernière partie de cette série de didacticiels, je vais le tester en utilisant le demandes bibliothèque via terminal.

>>> demandes d'importation >>> 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 = request .post ('http://127.0.0.1:5000/api/product', data = json.dumps (d), en-têtes = '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), en-têtes = '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:55: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

Comment personnaliser

Il est très pratique de créer automatiquement les API RESTful, mais chaque application possède une logique métier qui nécessite des personnalisations, des validations et un traitement intelligent / sécurisé des demandes selon les besoins.. 

Ici, demande pré-processeurs et post-processeurs viens à la rescousse. Comme le nom l'indique, les méthodes désignées comme préprocesseurs s'exécutent avant le traitement de la demande et les méthodes désignées comme postprocesseurs s'exécutent après le traitement de la demande.. create_api () est le lieu où ils sont définis en tant que dictionnaires du type de requête (OBTENIR, POSTER, etc.) et les méthodes sous forme de liste qui agira en tant que pré-processeur ou post-processeur sur la requête spécifiée. Voici un exemple de modèle:

manager.create_api (Product, methods = ['GET', 'POST', 'DELETE'], préprocesseurs = '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'] 

le OBTENIR, METTRE, et PIÈCE les demandes ont la possibilité d'être renvoyées pour un ou plusieurs enregistrements; par conséquent, ils ont deux types chacun. Dans le code ci-dessus, remarquez GET_SINGLE et GET_MANY pour OBTENIR demandes. 

Les pré-processeurs et les post-processeurs acceptent différents paramètres pour chaque type de requête et travaillent sans valeur de retour. Ceci est laissé pour vous d'essayer vous-même.

Conclusion

Dans cette partie de cette série de didacticiels, nous avons vu comment créer une API RESTful à l'aide de Flask en ajoutant quelques lignes à un modèle basé sur SQLAlchemy.. 

Dans la dernière et dernière partie de cette série, nous expliquerons comment créer une API RESTful à l'aide d'une autre extension Flask populaire, mais cette fois, l'API sera indépendante de l'outil de modélisation utilisé pour la base de données..