Sådan opbygges RESTful API'er med Falcon

Introduktion

RESTful API'er er en vigtig komponent i enhver velarkitekteret stak, og Python har tilfældigvis nogle strålende rammer til hurtigt at komponere API'er.

En af disse rammer kaldes Falcon - og den er fantastisk! I det væsentlige et mikroframework leveres det med et stort antal fordele:

  1. Det er hurtigt. Virkelig hurtig. Se benchmarks her.
  2. HTTP-ressourcer defineres som klasser, hvor klassemetoder bruges til forskellige REST-operationer på disse ressourcer. Dette hjælper med at opretholde en ren kodebase.
  3. Det er ret udvideligt - tjek dette afsnit på deres wiki for at få en fornemmelse for det.
  4. Det er baseret på WSGI - Pythonic-standarden til webapps - så det fungerer med Python 2.6, 2.7 og 3.3+. Og hvis du har brug for mere ydeevne, skal du køre den ved hjælp af PyPy!

Kom godt i gang

Lad os først forberede vores miljø. Personligt er det altid dejligt at arbejde i virtuelle miljøer - du kan bruge virtualenv, virtualenvwrappereller venv. Dernæst installere Falcon hjælp pip: pip install falcon.

Vi skal udvikle en lille prøve-API, der gør meget grundlæggende tidszonemanipulationer for os. Det viser det aktuelle tidspunkt i UTC såvel som den tilsvarende epoke-tid. Til det formål vil vi få fat i en fiks bibliotek kaldet arrow: pip install arrow.

Du kan finde den færdige prøve på //github.com/rudimk/freecodecamp-guides-rest-api-falcon.

Ressourcer

Tænk på en ressource som en enhed, som din API har brug for at manipulere. I vores tilfælde ville den bedste ressource være en Timestamp. Vores routing vil typisk være sådan noget:

GET /timestamp

Her GETer HTTP-verbet, der bruges til at kalde dette slutpunkt, og /timestamper selve URL'en. Nu hvor vi har fået denne bit ud af vejen, lad os oprette et modul!

$ touch timestamp.py

Tid til at importere Falcon-biblioteket:

import json import falcon import arrow

Bemærk, at vi også importerer jsonpakken og arrowbiblioteket. Lad os nu definere en klasse for vores 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

Lad os gennemgå dette uddrag. Vi har defineret en Timestampklasse og defineret en klassemetode kaldet on_get- denne funktion fortæller Falcon, at når en GETanmodning udstedes til et slutpunkt for denne ressource, skal du køre on_getfunktionen og angive anmodnings- og svarobjekterne som parametre.

Derefter er det glat - vi opretter en tom ordbog, udfylder den med de aktuelle UTC- og UNIX-tidsstempler, konverterer den til JSON og vedhæfter den til svarobjektet.

Ret simpelt, ikke? Men desværre er det ikke alt. Vi er nu nødt til at oprette en Falcon-server og tilslutte den ressourceklasse, vi lige har defineret til et faktisk slutpunkt.

$ touch app.py

Tilføj nu koden nedenfor:

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

Her har vi defineret en Falcon API og initialiseret en forekomst af den ressourceklasse, vi oprettede tidligere. Derefter har vi tilsluttet /timestampslutpunktet med klasseinstansen - og nu er vi klar ! For at teste denne API-installation gunicorn( pip install gunicorn) og køre gunicorn app. Brug Postman eller simpelt cURLtil at teste dette:

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

Og det gør det!

Komme videre

Når du først har fået fat i Falcon, er det meget nemt at komponere kraftfulde RESTful API'er, der interagerer med databaser eller messaging-køer. Tjek Falcon-dokumenterne samt PyPI for interessante Falcon-moduler, der stadig dukker op.