Comment créer des API RESTful avec Falcon

introduction

Les API RESTful sont un composant majeur de toute pile bien architecturée, et Python se trouve avoir des cadres brillants pour composer rapidement des API.

L'un de ces frameworks s'appelle Falcon - et c'est génial! Essentiellement un microframework, il présente de nombreux avantages:

  1. C'est rapide. Très rapide. Découvrez les benchmarks ici.
  2. Les ressources HTTP sont définies comme des classes, les méthodes de classe étant utilisées pour différentes opérations REST sur ces ressources. Cela permet de maintenir une base de code propre.
  3. C'est assez extensible - consultez cette section sur leur wiki, pour en avoir une idée.
  4. Il est basé sur WSGI - le standard Pythonic pour les applications Web - il fonctionne donc avec Python 2.6, 2.7 et 3.3+. Et si vous avez besoin de plus de performances, exécutez-le en utilisant PyPy!

Commencer

Tout d'abord, préparons notre environnement. Personnellement, c'est toujours agréable de travailler dans des environnements virtuels - vous pouvez utiliser virtualenv, virtualenvwrapperou venv. Ensuite, installez Falcon en utilisant pip: pip install falcon.

Nous allons développer un petit exemple d'API qui effectue des manipulations très basiques de fuseau horaire pour nous. Il affichera l'heure actuelle en UTC, ainsi que l'heure de l'époque correspondante. À cette fin, nous saisissons une bibliothèque appelée nifty arrow: pip install arrow.

Vous pouvez trouver l'exemple fini sur //github.com/rudimk/freecodecamp-guides-rest-api-falcon.

Ressources

Considérez une ressource comme une entité que votre API doit manipuler. Dans notre cas, la meilleure ressource serait a Timestamp. Notre routage serait généralement quelque chose comme ceci:

GET /timestamp

Voici GETle verbe HTTP utilisé pour appeler ce point de terminaison et /timestampl'URL elle-même. Maintenant que nous avons éliminé ce problème, créons un module!

$ touch timestamp.py

Il est temps d'importer la bibliothèque Falcon:

import json import falcon import arrow

Notez que nous avons également importé le jsonpackage et la arrowbibliothèque. Maintenant, définissons une classe pour notre ressource:

class Timestamp(object): def on_get(self, req, resp): payload = {} payload['utc'] = arrow.utcnow().format('YYYY-MM-DD HH:mm:SS') payload['unix'] = arrow.utcnow().timestamp resp.body = json.dumps(payload) resp.status = falcon.HTTP_200

Passons en revue cet extrait. Nous avons défini une Timestampclasse et défini une méthode de classe appelée on_get- cette fonction indique à Falcon que lorsqu'une GETrequête est émise vers un point de terminaison pour cette ressource, exécutez la on_getfonction et fournissez les objets de requête et de réponse en tant que paramètres.

Après cela, tout va bien - nous créons un dictionnaire vide, le remplissons avec les horodatages UTC et UNIX actuels, le convertissons en JSON et l'attachons à l'objet de réponse.

Assez simple, non? Mais malheureusement, ce n'est pas tout. Nous devons maintenant créer un serveur Falcon et connecter la classe de ressources que nous venons de définir à un point de terminaison réel.

$ touch app.py

Maintenant, ajoutez le code ci-dessous:

import falcon from timestamp import Timestamp api = application = falcon.API() timestamp = Timestamp() api.add_route('/timestamp', timestamp)

Ici, nous avons défini une API Falcon et initialisé une instance de la classe de ressources que nous avons créée précédemment. Ensuite, nous avons connecté le /timestamppoint de terminaison avec l'instance de classe - et maintenant nous sommes prêts à partir! Pour tester cette API install gunicorn( pip install gunicorn), et exécutez gunicorn app. Utilisez Postman ou simple cURLpour tester ceci:

$ curl //localhost:8000/timestamp {"utc": "2017-10-20 06:03:14", "unix": 1508479437}

Et ça le fait!

Passer à autre chose

Une fois que vous avez maîtrisé Falcon, il est très facile de composer de puissantes API RESTful qui interagissent avec des bases de données ou des files d'attente de messagerie. Consultez la documentation Falcon, ainsi que PyPI pour les modules Falcon intéressants qui continuent à apparaître.