# coding=UTF8
# ^^^^^^^^^^^
# Mit der ersten Zeile legen wir die Kodierung der Quelltextdatei fest. Dies
# ist nötig, damit wir hier auch deutsche Umlaute benutzen können.
# Die Anwendung wurde mit dem Bottle-Framework (http://bottlepy.org/)
# erstellt. Dies ist ein einfaches Webframework für Python Anwendungen. Wir
# importieren zunächst die notwendigen Methoden.
from bottle import route, run, debug, request, response
# In dem Dictionary zitate sollen Zitate gesammelt werden. Jedes Zitat ist
# über eine ID erreichbar: {0: "Zitat 1", 1 : "Zitat 2", ...}
zitate = {}
# Mit route wird eine Ressource festgelegt. Dies ist der Teil, der hinter der
# Adresse des Hostnamens folgt. Eine Anfrage wird normalerweise über ein
# GET-request entgegen genommen. In diesem Fall wird eine Liste aller Zitate
# ausgegeben. Es ist guter Stil, den Namen des Ressource jeweils im Plural zu
# verwenden.
@route('/zitate', method='GET')
def zitate_liste():
# Über den Header können wir prüfen, welche Form der Ausgabe der Client
# erwartet. Da wir bei REST nur von Repräsentationen ausgehen, können die
# Inhalte unterschiedlich dargestellt und damit auch angefordert
# werden. Wir unterstützen HTML und Json als Formate.
if request.get_header('Accept') == "application/json":
return zitate
else:
# Wenn kein besonderes Format angefordert wurde, wird HTML
# ausgegeben. Wir stecken die Zitate in eine Tabelle und geben diese
# zurück.
html = "
Zitate
"
html += "Id | Zitat |
"
for k in zitate:
html += ""
html += "" + str(k) + " | " + zitate[k] + " | "
html += "
"
html += "
"
return html
# Ein bestimmtes Zitat kann über seine Nummer angesprochen und einzeln
# ausgegeben werden. Der Parameter in der URL wird an die Methode
# übergeben.
@route('/zitate/')
def zitate_get(nr):
zid = int(nr)
if zid in zitate:
return zitate[zid]
else:
# Die Nummer und damit das Zitat wurden nicht gefunden.
# Über den Statuscode melden wir den Misserfolg an den Client.
# Status 404: Not Found
response.status = 404
return "Zitatnummer nicht vorhanden: " + nr
# Damit wir etwas für die Anzeige haben, müssen auch neue Zitate eingetragen
# werden können. Diese geschieht über die HTTP Post-Methode. Die Daten, also
# der Text des Zitates, wird über den Body des requests übertragen. In der
# Antwort wird der Client über die Adresse der neuen Ressource
# informiert. Zusätzlich setzen wir die neue Adresse im Headerfeld Location.
# Schließlich wird der Status der Antwort auf 201 (Created) gesetzt. Damit die
# Methode nur auf POST reagiert, wird die route entsprechend konfiguriert.
@route('/zitate', method='POST')
def zitat_erstellen():
# Die ID für das nächste Zitat wird bestimmt. Wenn es noch keine Zitate
# gibt, ist es die 0, ansonsten wird die größte ID um 1 erhöht.
if len(zitate) == 0:
neue_id = 0
else:
neue_id = max(zitate.keys()) + 1
zitate[neue_id] = request.body.readline()
response.set_header("Location", request.url + "/" + str(neue_id))
response.status = 201 # 201: Created
# Als Ergebnis geben wir die komplette URI des neuen Zitates zurück
return request.url + "/" + str(neue_id)
# Anmerkung: Komplexe Einträge wie z.B. ein Zitat mit Informationen über den
# Autor und das Jahr der Verwendung werden nicht als Text, sondern als Json-
# oder XML-Inhalt übermittelt. Es sind aber auch binäre Daten wie Bilder oder
# MP3-Dateien möglich.
#
# START des Webservers auf Port 8000.
#
debug(True)
run(port=8000, reloader=True)