38. Lektion: Webserver: Unterschied zwischen den Versionen

Aus Attraktor Wiki

Wechseln zu: Navigation, Suche
(Einfacher Text)
(Einfacher Text)
Zeile 82: Zeile 82:
 
         version = 1.0.0
 
         version = 1.0.0
 
         return f"Aktuelle Version {version}", 200
 
         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))
 
</pre>
 
</pre>
  

Version vom 7. Dezember 2023, 10:00 Uhr

Webserver

Wlan einrichten

import 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 phew

Fü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.
Der Webserver wird einfach gestartet. Es ist keine großartige Konfiguration erforderlich. Allerdings müssen vorher noch die Webseiten und ihre Routen definiert werden.

from phew import server

# hier werden die auszuliefernden Webseiten definiert.   Siehe nächste Codebox.

server.run()

Webseiten generieren

Eine Webseite wird erstellt indem eine Funktion definiert wird, die den Inhalt des Response zurück gibt. Der Funktion muss request übergeben werden.
Damit der Server diese Funktion als Webseite erkennt muss sie entsprechend kenntlich gemacht werden. Dazu gibt es zwei Möglichkeiten:

Mit Decorator:

@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))

Es muss dem Decorator die Route - die Zeichen, die in der URL hinter der IP-Adresse stehen - und die HTTP-Methode (GET oder POST) ünergeben werden. Die Definition folgt in der nächsten Zeile.

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 erzeugen

Der Response ist ein String der alle Informationen enthält die an den Client zurückgegeben werden sollen.
Innerhalb der Definition kann alles das gemacht werden, was auch in einer Funktion möglich ist. Der Return-Wert ist der Response. Dieser kann auf unterschiedliche Weise erzeugt werden.

Einfacher Text

Hier 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 Datei

Um den Response aus einer Datei zurück zu geben gibt es die Funktion render_template().


Wenn die Seite nicht existiert

Der 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')

Beispiel

from phew.template import render_template
from os import stat
HTDOCS = 'htdocs/'          # Hier ist der "/" wichtig, sonst funktioniert es nicht! 

from phew import server

@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))

@server.route("/info", methods=["GET"])
def info_site(request):
    return "<h1>Infoseite vom Raspberry Pi Pico W</h1>"

@server.route("/test", methods=["GET"])
def test_site(request):
    return render_template(HTDOCS + "html-test_001.html")
#     return render_template("html-test_001.html")
#     return '''
#               <h1>Überschrift</h1>
#               Dieses ist eine kleine HTML-Testseite.
#               <br>
#               Noch ist es nur ein einfacher Test!
#            '''   
#     return render_template("html-test_001.html")


@server.catchall()
def catch_all(request):
    return "<h1>Hallo, diese Webseite gibt es nicht!</h1>", 404
#     return render_template(HTDOCS + index.html)





Lager