Blog

RESTful APIs mit dem Webframework Flask

Sep 2, 2019

Das Python-Framework Flask verfolgt einen minimalistischen Ansatz und eignet sich mit kurzen Reaktionszeiten gut für Microservices und Programmierschnittstellen. RESTful APIs haben sich mittlerweile als Standard für die Kommunikation unter Maschinen durchgesetzt. Dieser Artikel zeigt, wie Sie solche Interfaces mit Flask aufsetzen können, inklusive objektrelationaler Datenbankanbindung mit SQLAlchemy.

Programmierschnittstellen spielen heutzutage eine große Rolle im Internet. Neben der normalen Benutzung über Seiten im Browser wird mittlerweile zu jedem guten Web-Service ein API (Application Programming Interface) angeboten, über das Anwender alternativ auf Angebote zugreifen können. Das ist zum Beispiel der Fall bei Twitter, Wikipedia, GitHub, DigitalOcean und vielen anderen, und auch CMS-Systeme wie WordPress lassen sich über externe Schnittstellen ansprechen und nutzen. Andere Services wie zum Beispiel Amazons Objektspeicher S3 sind als Geschäftsmodell direkt als API aufgesetzt. Auch wenn es nicht ausgeschlossen ist, sind diese als Interface aufgesetzten Zugangslösungen eigentlich nicht für den händischen Gebrauch mit bestimmten Standardwerkzeugen gedacht, sondern dienen vor allem dazu, mittels speziell dafür geschriebener Software angesprochen zu werden. Die angebotenen APIs richten sich dabei vor allem an Entwickler von Endanwenderlösungen, um für den verfügbaren Service speziell konfektionierte Applikationen herzustellen oder in eigene Angebote wie etwa Metaportale zu integrieren. Prinzipiell steht es dabei aber jedem Benutzer offen, sich selbst Programme zu schreiben mit denen er APIs anzapft um Daten auszulesen oder zu schreiben, und die für ein Webportal erworbene Zugangsberechtigung gilt meistens auch für diesen alternativen Kommunikationsweg. Die Anbieter von Web-Services auf der anderen Seite sind vor allem aber daran interessiert, welche Mittel gut dafür geeignet sind, um ein API aufzusetzen und zur Verfügung zu stellen.

STAY TUNED!

Learn more about API Conference

Der Standard für Programmierschnittstellen, der seit einigen Jahren verstärkt eingesetzt wird und der sich neben Konkurrenten wie SOAP und XML-RPC mittlerweile durchgesetzt hat, ist REST (Representational State Transfer) [1]. Bei dem im Jahr 2000 entwickelten REST handelt es sich aber nicht um eine Spezifikation, sondern um eine Richtlinie beziehungsweise ein Designprinzip für die Kommunikation von Maschinen, das gut oder schlecht umgesetzt werden kann (im Englischen gibt es dafür den Ausdruck „RESTfulness“). Der theoretische Hintergrund von RESTful APIs ist ein Thema für sich, denn es handelt sich um einen abstrakten Architekturstil, der eine konkrete Implementierung eigentlich nicht vorgibt, und die jeweilige Anwendungslogik muss von Entwicklern selbst auf die REST-Prinzipien abgebildet werden. In der Praxis bedeutet das, zwischen den bei einem Service beteiligten Komponenten eine zusätzliche Schicht einzufügen, die unabhängig von der spezifischen Infrastruktur als Abstraktionsebene funktioniert. Für den API-Endanwender spielt es dann keine Rolle, wie das Schnittstellen-Backend technisch realisiert ist. Als Grundlage für die Umsetzung der im Hintergrund stehenden Prinzipien setzen RESTful APIs als Web-Services konkret auf das bewährte, zustandslose Webprotokoll HTTP und machen sich dessen Eigenschaften wie die eingebauten Statuscodes zunutze. In Bezug auf Datensätze werden die HTTP-Methoden POST, GET, PUT/PATCH und DELETE verwendet, um die Elemente des CRUD-Zyklus (Create, Read, Update, Delete) umzusetzen. Dabei werden Ressourcen im allgemeinen Sinn, wie zum Beispiel Datenbankeinträge, als eindeutige Webadressen zur Verfügung gestellt (etwa http://beispiel.de/rechnungen/2018/07), die Sie mit beliebigen HTTP-Klienten wie curl oder HTTPie ansprechen und manipulieren können. Bei einem RESTful API liegt der Fokus auf den repräsentierten Objekten und das Interface erklärt sich dabei praktisch selbst – und das ist, alles in allem, ein attraktives Konzept mit vielen positiven Effekten. So können sich z. B. externe Entwickler und neue Mitarbeiter schnell in die damit umgesetzte Anwendungslogik einarbeiten.

 

How to develop Web APIs?

Explore the API Development Track




Es gibt mit Flask-RESTful [11] mittlerweile eine spezielle Erweiterung für Flask, die das Schreiben von APIs damit noch weiter vereinfacht. Ein weiteres, diesmal wieder reduziertes aber funktionstüchtiges Gebrauchtwagenbeispiel (Listing 7) zeigt, wie Sie diese Erweiterung anwenden (es fehlen gegenüber Listing 3 aber lediglich checkPostObjekt() und die Rückgabe von Statuscode 400 bei nicht vorhandenen IDs). Die durch bestimmte HTTP-Methoden vom Klienten auslösbaren Operationen definieren Sie hier als Klassen (Abkömmlinge von Resource), die Sie mit api.add_resource() bestimmten Endpunkten zuweisen. Zurückgegeben mit return werden grundsätzlich JSON-Objekte mit passendem Content-Type im HTTP-Header, die Funktion jsonify() von Flask ist hier also überflüssig. Statuscodes für die Rückgabe müssen nicht erst als Instanz von Response angelegt werden, sondern können praktischerweise direkt bei return mit angegeben werden. Diese Erweiterung macht es noch einfacher, RESTful APIs mit Flask aufzusetzen, klassenbasiert entwickeln zu können, und bietet eine saubere Trennung von Geschäftslogik und Endpunktdefinition.

Listing 7: „gebrauchtwagen3.py“
#!/usr/bin/env python3
from flask import Flask, request
from flask_restful import Resource, Api
import uuid

app = Flask(__name__)
api = Api(app)
autos = []

class getAutos(Resource):
  def get(self):
    return {'gebrauchtwagen': autos}
  
class addAuto(Resource):
  def post(self):
      post_content = request.get_json()
      post_content['id'] = uuid.uuid4().hex
      autos.append(post_content)
      return post_content, 201

class autoByID(Resource):
  def get(self, id):
    for auto in autos:
      if auto['id'] == id:
        return auto

api.add_resource(getAutos, '/autos')
api.add_resource(addAuto, '/autos')
api.add_resource(autoByID, '/autos/')

app.run(port=5000)

Fazit

Über die rudimentären Anwendungsbeispiele hinaus handelt es sich bei Flask um ein produktionsreifes Werkzeug mit dem Sie auch komplexe RESTful APIs für die Kommunikation von Maschinen untereinander aufsetzen können. Dieses Mikroframework ist dafür sehr geeignet und stellt die benötigten Mittel unkompliziert zur Verfügung. Mit der Wahl von Flask als Grundlage steht der gesamte Fundus der Python-Bibliotheken für die Entwicklung bereit und es gibt eine ganze Reihe von Flask-Erweiterungen, die spezielle Anbindungen an Python-Highlights wie zum Beispiel SQLAlchemy zur Verfügung stellen. Flask bietet mit seinem minimalistischen Ansatz zudem schnelles Prototyping und gute Reaktionszeiten, was gegenüber anderen Webframeworks einen zusätzlichen Pluspunkt ausmacht.

 

Links & Literatur
[1] Tilkov, Stephan u. a.: „REST und HTTP: Entwicklung und Integration nach dem Architekturstil des Web.“ dpunkt.verlag: Heidelberg
[2] http://flask.pocoo.org/
[3] Stender, Daniel: „Mit Flask Webapplikationen in Python entwickeln“, in: Entwickler Magazin 6.2017
[4] Grinberg, Miguel: „Microservices with Python and Flask“. Workshop auf der PyCon2017: https://www.youtube.com/watch?v=nrzLdMWTRMM
[5] Baumgold, David: „Prototyping new APIs with Flask“. Vortrag auf der PyCon2016: https://www.youtube.com/watch?v=6RdZNiyISVUs
[6] https://github.com/pallets/flask
[7] http://gunicorn.org/
[8] https://curl.haxx.se/
[9] http://flask-sqlalchemy.pocoo.org
[10] http://www.sqlalchemy.org/
[11] http://flask-restful.readthedocs.io/

Alle News & Updates zur API Conference:

Behind the Tracks

API Management

Ein detaillierter Blick auf die Entwicklung von APIs

API Development

Architektur von APIs und API-Systemen

API Design

Von Policys und Identitys bis Monitoring

API Platforms & Business

API Plattformen in Verbindung mit SaaS