38. Lektion: Webserver: Unterschied zwischen den VersionenAus Attraktor Wiki
Version vom 7. Dezember 2023, 17:44 UhrInhaltsverzeichnisWebserverWlan einrichtenimport network # Wlan Verbindung herstellen wlan = network.WLAN(network.STA_IF) wlan.active(True) if not wlan.isconnected(): print('connecting to network...') wlan.connect('ssid', 'key') while not wlan.isconnected(): pass print('network config:', wlan.ifconfig()) Das Webserver Packet phewFür den Raspberry Pi Pico W gibt es ein Packet, das alles enthält, was zur Einrichtung eines Webservers auf dem Pico erforderlich ist. Es heißt "phew" und ist von Github unter https://github.com/pimoroni/phew zu beziehen. Das Archiv muss entpackt und dann das Unterverzeichnis "phew" ins Filesystem des Pico kopiert werden.
from phew import server # hier werden die auszuliefernden Webseiten definiert. Siehe nächste Codebox. server.run() Einfaches Wlan verbindenPhew bietet eine einfachere Möglichkeit die Verbindung zum Wlan herzustellen:
from phew import server, connect_to_wifi connect_to_wifi("Attraktor", "blafablafa") 2023-12-07 17:37:01 [debug / 143kB] - connecting 2023-12-07 17:37:04 [debug / 141kB] - connecting '192.168.5.120' Lt. Beschreibung gibt es eine Funktion get_ip_address(). Bei mir hat sie aber nicht funktioniert und ich habe sie auch nicht im Quellcode finden können. Deshalb macht es Sinn, diese in eine Variable zu speichern: from phew import server, connect_to_wifi ip_adresse = connect_to_wifi("Attraktor", "blafablafa") 2023-12-07 17:48:47 [debug / 146kB] - got ip address >>> ip_adresse '192.168.5.120' Webseiten generierenEine Webseite wird erstellt indem eine Funktion definiert wird, die den Inhalt des Response zurück gibt. Der Funktion muss request übergeben werden.
Mit Decorator:Ein Decorator ist ein Konzept, dass eine Funktion dekoriert. D.h. Er ergänzt die Funktion, fügt also eine zusätzliche Funktionalität hinzu.
@server.route("/random", methods=["GET"]) def random_number(request): import random min = int(request.query.get("min", 0)) max = int(request.query.get("max", 100)) return str(random.randint(min, max)) Mit Route-Tabelle:# Webseiten definieren def random_number(request): import random min = int(request.query.get("min", 0)) max = int(request.query.get("max", 100)) return str(random.randint(min, max)) def info_site(request): return "<h1>Infoseite vom Raspberry Pi Pico W</h1>" # Routing Tabelle server.add_route("/random", random_number, methods=["GET"]) server.add_route("/info", info_site, methods=["GET"]) Response erzeugenDer Response ist ein String der alle Informationen enthält die an den Client zurückgegeben werden sollen.
Einfacher TextHier steht hinter return ein String, der den Response enthält. Dieser kann, aber muss nicht, HTML-Auszeichnungen enthalten. Es kann ein kurzer Text sein, oder auch eine umfangreiche Webseite mit HTML-Header und -body. Als zweites Argument kann der HTTP-Code - hier 404 - agegeben werden. @server.catchall() def catch_all(request): return "<h1>Hallo, diese Webseite gibt es nicht!</h1>", 404 # oder mit f-string: @server.route("/test", methods=["GET"]) def test_seite(request): version = 1.0.0 return f"Aktuelle Version {version}", 200 # oder mit einer Funktion: @server.route("/random", methods=["GET"]) def random_number(request): import random min = int(request.query.get("min", 0)) max = int(request.query.get("max", 100)) return str(random.randint(min, max)) In einer Variablen@server.route("/info", methods=["GET"]) def info_seite(request): content = ''' <html> <header> .... </header> <body> .... </body> </html> ''' return content, 200 Aus einer DateiUm den Response aus einer Datei zurück zu geben gibt es die Funktion render_template().
from phew.template import render_template HTDOCS = 'htdocs/' @server.route("/test", methods=["GET"]) def test_site(request): return render_template(HTDOCS + "html-test_001.html") Wenn die Seite nicht existiertDer Server gibt üblicherweise die der Route zugeordnete Webseite zurück. Wenn eine Webseite angefordert wird, die nicht existiert, wird die Servermethode catchall() aufgerufen. @server.catchall() def catch_all(request): return "<h1>Hallo, diese Webseite gibt es nicht!</h1>", 404 # oder aus einer Datei in /htdocs: HTDOCS = 'htdocs/' @server.catchall() def catch_all(request): return render_template(HTDOCS + 'error_404.html') BeispielLager
|