# Tutorial FastAPI ASE WS 2022/23 ## Setup Wir arbeiten wie beim letzten Mal als Nutzer `root` auf einem 'disposable root server' [via segfault.net](https://blog.thc.org/disposable-root-servers). ssh root@segfault.net # Password is 'segfault' **Achtung:** Der Server ist nicht sicher - keine vertraulichen Infos/Passwörter dort eintippen Erster Schritt auf dem Server: Informationen zu Netzwerk-Schnittstellen prophylaktisch in einen Text-Editor kopieren Vor allem relevant: der 'reverse' Port, da wir über diesen auf den Server zugreifen werden. Zweiter Schritt: tmate installieren und ausführen. apt install tmate tmate `tmate` startet eine `tmux`-Session und gibt Pfade/Befehle aus, mit denen man der Session remote beitreten kann. Diese Infos am Besten auch in einem Texteditor speichern und 'q' drücken. Dritter Schritt: uvicorn installieren apt install uvicorn ## My First FastAPI app import random import fastapi fruit = ["Apple", "Banana", "Tomato", "Orange", "Grapefruit"] app = fastapi.FastAPI() @app.get("/random") async def rand(starts_with: str = None): global fruit if starts_with: filtered_fruit = [n for n in fruit if n.lower().startswith(starts_with.lower())] if len(filtered_fruit) < 1: return {"name": None} else: random_fruit = random.choice(filtered_fruit) else: random_fruit = random.choice(fruit) return {"fruit": random_fruit} Starte den uvicorn-Server mit: `uvicorn main:app --reload` (lokaler Server) bzw. `uvicorn --host 0.0.0.0 --port {PORT} main:app --reload` (segfault.net) Ersetze `{PORT}` ggf. mit dem Reverse-Port Öffne die URL (localhost:8000 oder HOST:PORT): `localhost:8000/random` `localhost:8000/docs` ## Eine POST-Route Ergänze main.py um folgenden Code: @app.post("/new") async def new(new_fruit: str): global fruit fruit.append(new_fruit) return {"fruit": new_fruit} Der uvicorn-Server sollte automatisch neustarten, so dass die aktuellste Version läuft. ## Eine Datenbank Lade das Beispiel aus dem FastAPI-Tutorial herunter und starte den uvicorn-Server: `git clone https://github.com/vnurhaqiqi/fastapi-sqlite.git` `cd fastapi-sqlite/` `uvicorn --host 0.0.0.0 --port {PORT} sql_app.main:app --reload` ## Weitere Aufgaben Lies die [FastAPI-Doku](https://fastapi.tiangolo.com/) und/oder das [Ultimate FastAPI tutorial](https://christophergs.com/tutorials/ultimate-fastapi-tutorial-pt-1-hello-world/) und ergänze Dein Projekt bis zum Freitag, 13.1.2022 um folgende Features: * HTTP-Statuscodes implementieren (z.B. `201 - Created` bei Anlegen eines Nutzer) * Datenbank-Unterstützung einbauen (Vorschlag: SQLite) * Datenbank-Tabellen für Räume, Störungen, Benutzer anlegen (und ggf. weitere, wie z.B. Gebäude/teile) * Routen zum Import und Export aller Daten, zum Anlegen, Verändern und Löschen von Räumen, Störungen und Benutzern * Routen zur Ausgabe von Räumen, Störungen und Benutzern, sowie Filter * Dokumentation der einzelnen Routen * Optional: Authentisierung über JWT (siehe auch: OAuth)