Blog-Artikel
REST API mit Python und Heroku: Schritt für Schritt
REST API mit Python und Heroku: Schritt für Schritt von Flask-RESTful über die lokale Entwicklung bis zum Deployment in der Cloud.
So fing alles an: Erst eine Woche zuvor hatte ich begonnen, Python zu lernen und auf eigene Faust Dinge auszuprobieren. Klassen, Variablen, Schleifen und Pakete – all diese Aspekte des Programmierens waren spannend. Die eigentliche Herausforderung begann jedoch, als ich einen RESTful Service entwickeln und DEPLOYEN wollte.
Hier zeige ich Schritt für Schritt, wie ich dabei vorgegangen bin. Am Ende landet auch Ihre Anwendung in der Cloud – genau wie meine :)
REST API mit Python und Flask-RESTful erstellen
Wenn Python und Pip auf Ihrem Rechner installiert sind, können wir mit einem neuen Anwendungsordner beginnen. Ich nenne ihn python-service-deployment.
Schritt 1: Virtuelle Umgebung einrichten
Eine virtuelle Umgebung hilft dabei, Versionskonflikte zwischen Paketen zu vermeiden. Alle Pakete, die Sie für Ihre Anwendung installieren, befinden sich innerhalb dieser Umgebung. Möchten Sie für eine andere Anwendung eine abweichende Version desselben Pakets installieren, liegt diese – genau – in einer eigenen virtuellen Umgebung.
So erstellen Sie die Umgebung: Wechseln Sie im Terminal in Ihr Arbeitsverzeichnis – unter Windows in der Eingabeaufforderung – und geben Sie Folgendes ein:
Javascript python3 -m venv my-venv
Dadurch entsteht das Verzeichnis my-venv, das eine Kopie des Python-Interpreters und die zugehörigen Dateien enthält.
Um die virtuelle Umgebung auf einem Mac zu aktivieren, führen Sie diesen Befehl aus:
Javascript source my-venv/bin/activate
Unter Windows aktivieren Sie sie mit:
Javascript my-venv\scripts\activate.bat
Schritt 2: Python-Interpreter konfigurieren
Mein Lieblingseditor ist VS Code – welcher ist Ihrer? :)
Konfigurieren wir VS Code so, dass der Python-Interpreter aus der virtuellen Umgebung my-venv verwendet wird.
Öffnen Sie die Command Palette über das Menü „View“ oder mit Command+Shift+P – unter Windows mit Ctrl+Shift+P – und geben Sie Folgendes ein:
Python: Select Interpreter
:quality(85)/)
Wählen Sie wie oben hervorgehoben den Interpreter aus der virtuellen Umgebung. In meinem Fall ist es der letzte Eintrag in der Liste. Nun ist VS Code bereit, Ihre Python-Kenntnisse zu interpretieren :)
Schritt 3: Flask-RESTful installieren
Flask-RESTful ist eine Erweiterung des Microframeworks Flask für die Entwicklung von REST APIs. Installieren wir sie:
Javascript pip install flask-restful
Damit werden Flask-RESTful und seine Abhängigkeiten in der zuvor erstellten virtuellen Umgebung installiert.
Schritt 4: REST API entwickeln
Eine RESTful API verwendet HTTP-Anfragen, um Daten mit GET, PUT, POST und DELETE abzurufen, zu ändern, hinzuzufügen oder zu löschen.
Steigen wir direkt in den Code ein und implementieren diese Verben. Ich möchte eine einfache RESTful API erstellen, die anhand einer ID ein TODO-Element anzeigt und der TODO-Liste außerdem ein neues Element hinzufügt.
Zunächst erstellen wir die Datei todo.py. Sie enthält die Klasse Todo und implementiert die Verben GET und POST. Um die Struktur übersichtlich zu halten, habe ich todo.py im Ordner resources abgelegt.
Pythonfrom flask_restful import Resource
todos = [
{
"id": 1,
"item": "Create sample app",
"status": "Completed"
},
{
"id": 2,
"item": "Deploy in Heroku",
"status": "Open"
},
{
"id": 3,
"item": "Publish",
"status": "Open"
}
]
class Todo(Resource):
def get(self, id):
for todo in todos:
if id == todo["id"]:
return todo, 200
return "Item not found for the id: {}".format(id), 404
def put(self, id):
for todo in todos:
if id == todo["id"]:
todo["item"] = request.form["data"]
todo["status"] = "Open"
return todo, 200
return "Item not found for the id: {}".format(id), 404
Schauen wir uns den Code genauer an.
In der ersten Zeile importiere ich Resource aus flask_restful. Dadurch erhalten wir Zugriff auf HTTP-Methoden wie GET, PUT, POST und DELETE.
Die Zeilen 3 bis 20 definieren das Objekt todos. Idealerweise würde es in einer Datenbank liegen, der Einfachheit halber habe ich es jedoch direkt hier angelegt.
Ab Zeile 21 wird es interessant: Die Klasse Todo enthält eine GET- und eine PUT-Methode. Ruft jemand die URL /Todo/{id} auf, wird je nach GET- oder PUT-Anfrage die entsprechende Methode ausgeführt. Das Routing haben wir allerdings noch nicht definiert. Das holen wir jetzt nach.
Erstellen wir im Stammverzeichnis die Datei app.py:
Pythonfrom flask import Flask
from flask_restful import Api
from resources.todo import Todo
app = Flask(_ _name_ _)
api = Api(app)
api.add_resource(Todo, "/todo/")
if _ _name_ _ == "_ _main_ _":
app.run()
Hier importiere ich die benötigten Pakete, einschließlich der gerade erstellten Klasse Todo. Hinzu kommt die übliche Verknüpfung von Anwendung und API.
Die Routing-Logik steht in Zeile 9. Das URL-Muster /todo/<id> leitet die Anfrage an die Klasse Todo weiter. Die Art der Anfrage bestimmt, ob die in der Klasse definierte Methode „Get“ oder „Put“ ausgeführt wird. Sie können dies mit einem beliebigen REST-Client testen.
Schritt 5: Anwendung für Heroku vorbereiten und deployen
Gut, die API steht. Sehen wir uns nun an, wie sie gehostet werden kann.
Installieren Sie Gunicorn, einen WSGI, mit dem Python-Anwendungen auf Heroku ausgeführt werden.
Python pip install gunicorn
Erstellen Sie nun im Stammverzeichnis der Anwendung eine Datei namens Procfile ohne Dateiendung. Sie teilt Heroku mit, welcher Teil des Codes beim Start der Anwendung ausgeführt werden soll. In unserem Fall tragen Sie Folgendes ein:
Javascript web: gunicorn app:app
Legen Sie anschließend die Python-Version in der Datei runtime.txt im Stammverzeichnis fest:
python-3.6.7
Erstellen Sie nun die Datei requirements.txt, in der die Abhängigkeiten Ihrer Anwendung aufgeführt werden. Führen Sie dazu im Terminal – unter Windows in der Eingabeaufforderung – diesen Befehl aus:
Python pip freeze > requirements.txt
Nun folgt der Heroku-Teil. Nachdem Sie die Heroku CLI heruntergeladen haben, wechseln Sie zum Terminal beziehungsweise zur Eingabeaufforderung und melden sich mit dem folgenden Befehl bei Heroku an. Anschließend werden Sie aufgefordert, Ihre Zugangsdaten einzugeben und die Sitzung zu authentifizieren.
Javascript heroku login
Nach der erfolgreichen Anmeldung erstellen Sie eine Heroku-App, committen Ihre Dateien und übertragen die Änderungen mit den folgenden Befehlen:
heroku create– erstellt eine App in Herokugit init– initialisiert ein lokales Git-Repositoryheroku git:remote -a “remote repo name”– stellt die Verbindung zum Remote-Repository hergit commit -am “initial commit”– committet alle Dateiengit push heroku master– überträgt die Änderungen zu Heroku
Nach dem erfolgreichen Deployment können Sie die GET-Methode testen, indem Sie im Browser „https://[heroku domain]/todo/1(https://quiet-refuge-59730.herokuapp.com/todo/1)“ aufrufen.
Damit ist zusammengefasst, wie ich die Anwendung zum Laufen gebracht habe. Wenn Sie bis hierhin mitgemacht haben, hat Ihnen die Anleitung hoffentlich ebenfalls geholfen.
Als Nächstes werde ich darüber schreiben, wie ich AWS Lambda und API Gateway nutze, um RESTful Services in Python zu entwickeln. Bleiben Sie dran.
Den vollständigen Code zu diesem Beispiel finden Sie hier.