Aktualisiert "Einführung in Python Web Application Homebrew für Webingenieure im 3. Jahr, die langsam sind"

Das Buch wurde aktualisiert

Kapitel "HTML-Dateien zulassen" wurde aktualisiert. ..

Wenn Sie mehr lesen möchten, "mögen" oder "folgen Sie mir" in Buch ;-)


Das Folgende ist ein Auszug aus dem Inhalt des Buches.


Interpretieren Sie die Anforderung und lassen Sie sie die angegebene HTML-Datei zurückgeben

Bis zum vorherigen Kapitel konnten wir einen Server erstellen, der eine Antwort im HTTP-Format zurückgeben kann.

Es wird jedoch keine Verarbeitung implementiert, um die vom Browser gesendete Anforderung zu interpretieren, sodass der Text immer "Es funktioniert!" Zurückgibt, unabhängig davon, welche Anforderung kommt.

Dies reicht nicht aus. Bereiten Sie daher im Voraus eine HTML-Datei getrennt vom Programmquellcode vor, damit die im Anforderungspfad angegebene Datei als Antworttext zurückgegeben werden kann.

Dies ist eine sogenannte * statische Dateiverteilung *.

Es ist nicht erforderlich, den Quellcode des Servers über den Server zu veröffentlichen. ** Legen Sie die Dateien, die Sie über den Server veröffentlichen möchten, im Verzeichnis study / static / ** ab

Beispiel) Der Anforderungspfad lautet / index.html => Der Inhalt von study / static / index.html wird als Antworttext zurückgegeben

Und so weiter.

Quellcode

Es gibt nichts anderes zu erklären, also gehen wir direkt zum Quellcode.

Hier ist eine verbesserte Version der HTML-Datei, die im Voraus vorbereitet wurde, damit sie als Antworttext zurückgegeben werden kann.

study/WebServer.py

import os
import socket
from datetime import datetime


class WebServer:
    """
Eine Klasse, die einen Webserver darstellt
    """
    #Verzeichnis mit ausführbaren Dateien
    BASE_DIR = os.path.dirname(os.path.abspath(__file__))
    #Verzeichnis zum Speichern statisch zu liefernder Dateien
    DOCUMENT_ROOT = os.path.join(BASE_DIR, "static")

    def serve(self):
        """
Starten Sie den Server
        """

        print("===Starten Sie den Server===")

        try:
            #Socket generieren
            server_socket = socket.socket()
            server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

            #Weisen Sie den Socket dem Port 8080 von localhost zu
            server_socket.bind(("localhost", 8080))
            server_socket.listen(10)

            #Warten Sie auf eine Verbindung von außen und stellen Sie eine Verbindung her, wenn eine Verbindung besteht
            print("===Warten Sie auf eine Verbindung vom Client===")
            (client_socket, address) = server_socket.accept()
            print(f"===Die Verbindung mit dem Client ist vollständig remote_address: {address} ===")

            #Holen Sie sich die vom Client gesendeten Daten
            request = client_socket.recv(4096)

            #Schreiben Sie die vom Client gesendeten Daten in eine Datei
            with open("server_recv.txt", "wb") as f:
                f.write(request)

            #Die gesamte Anfrage
            # 1.Anforderungszeile(Die erste Zeile)
            # 2.Text anfordern(2. Zeile leere Zeile)
            # 3.Text anfordern(Leerzeile ~)
            #Analysieren zu
            request_line, remain = request.split(b"\r\n", maxsplit=1)
            request_headers, request_body = remain.split(b"\r\n\r\n", maxsplit=1)

            #Analysieren Sie die Anforderungszeile
            method, path, http_version = request_line.decode().split(" ")

            #Am Anfang des Weges/Und behalte es als relativen Weg
            relative_path = path.lstrip("/")
            #Holen Sie sich den Pfad der Datei
            static_file_path = os.path.join(self.DOCUMENT_ROOT, relative_path)

            #Antworttext aus Datei generieren
            with open(static_file_path, "r") as f:
                response_body = f.read()

            #Generieren Sie eine Antwortzeile
            response_line = "HTTP/1.1 200 OK\r\n"
            #Antwortheader generieren
            response_header = ""
            response_header += f"Date: {datetime.utcnow().strftime('%a, %d %b %Y %H:%M:%S GMT')}\r\n"
            response_header += "Host: HenaServer/0.1\r\n"
            response_header += f"Content-Length: {len(response_body.encode())}\r\n"
            response_header += "Connection: Close\r\n"
            response_header += "Content-Type: text/html\r\n"

            #Generieren Sie die gesamte Antwort
            response = (response_line + response_header + "\r\n" + response_body).encode()

            #Senden Sie eine Antwort an den Client
            client_socket.send(response)

            #Kommunikation beenden
            client_socket.close()

        finally:
            print("===Stoppen Sie den Server.===")


if __name__ == '__main__':
    server = WebServer()
    server.serve()

https://github.com/bigen1925/introduction-to-web-application-with-python/blob/main/codes/chapter11/WebServer.py

Um zu überprüfen, ob das Programm ordnungsgemäß funktioniert, müssen Sie eine HTML-Datei separat vorbereiten. Erstellen Sie diese ebenfalls. Erstellen Sie ein neues "statisches" Verzeichnis direkt unter dem "Studien" -Verzeichnis und erstellen Sie eine "index.html" darin.

Da es eine große Sache ist, habe ich es in etwas geändert, das nicht Apaches Puck ist. Sie können verwenden, was Sie möchten. Wenn Sie jedoch den Dateinamen ändern, funktioniert dies nicht wie in diesem Handbuch beschrieben. Belassen Sie den Dateinamen daher als "index.html".

study/static/index.html

<!doctype html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>HenaServer</title>
</head>
<body>
  <h1>Welcome to HenaServer!</h1>
</body>
</html>

https://github.com/bigen1925/introduction-to-web-application-with-python/blob/main/codes/chapter11/static/index.html

Kommentar

Zeilen 10-13: Definition des Verzeichnisses zum Ablegen von HTML-Dateien

Definiert das Verzeichnis, in dem die HTML-Dateien abgelegt werden (genannt "DOCUMENT_ROOT").

    #Verzeichnis mit ausführbaren Dateien
    BASE_DIR = os.path.dirname(os.path.abspath(__file__))
    #Verzeichnis zum Speichern statisch zu liefernder Dateien
    DOCUMENT_ROOT = os.path.join(BASE_DIR, "static")

Es kann schwierig sein zu lesen, wenn Sie mit Dateipfaden in Python nicht vertraut sind. --BASE_DIR: study absoluter Pfad zum Verzeichnis --DOCUMENT_ROOT: Absoluter Pfad des Verzeichnisses study / static

Wird gelagert.

Zeilen 43-61: Generieren Sie einen Antworttext aus einer Datei

Dies ist die Hauptsache.

Die HTTP-Anforderung wird analysiert (zerlegt) und die Pfadinformationen werden extrahiert.

Danach wird die Datei basierend auf dem Pfad gelesen und der Antworttext generiert.

            #Die gesamte Anfrage
            # 1.Anforderungszeile(Die erste Zeile)
            # 2.Text anfordern(2. Zeile leere Zeile)
            # 3.Text anfordern(Leerzeile ~)
            #Analysieren zu
            request_line, remain = request.split(b"\r\n", maxsplit=1)
            request_headers, request_body = remain.split(b"\r\n\r\n", maxsplit=1)

            #Analysieren Sie die Anforderungszeile
            method, path, http_version = request_line.decode().split(" ")

            #Am Anfang des Weges/Und behalte es als relativen Weg
            relative_path = path.lstrip("/")
            #Holen Sie sich den Pfad der Datei
            static_file_path = os.path.join(self.DOCUMENT_ROOT, relative_path)

            #Antworttext aus Datei generieren
            with open(static_file_path, "r") as f:
                response_body = f.read()

Nachdem ich den Pfad erhalten habe, kombiniere ich ihn mit "DOCUMENT_ROOT", um den "static_file_path" zu erhalten. Beachten Sie jedoch, dass ich das führende "/" zuvor entfernt habe.

Dies liegt daran, dass als Spezifikation von "os.path.join (base, path)" von Python das erste Argument "base" ignoriert wird, wenn der absolute Pfad, der mit "/" beginnt, dem zweiten Argument "path" gegeben wird. ist.

Versuche dich zu bewegen

Wenn Sie wissen, was Sie tun möchten, ist der Quellcode nicht schwierig. Verschieben Sie ihn also sofort.


Weiter mit Buch!

Kapitel "HTML-Dateien verfügbar machen"

Recommended Posts

Aktualisiert "Einführung in Python Web Application Homebrew für Webingenieure im 3. Jahr, die langsam sind"
Aktualisiert "Einführung in Python Web Application Homebrew für Webingenieure im 3. Jahr, die langsam sind"
Aktualisiert "Einführung in Python Web Application Homebrew für Webingenieure im 3. Jahr, die langsam sind"
Aktualisiert "Einführung in Python Web Application Homebrew für Webingenieure im 3. Jahr, die langsam sind"
Aktualisiert "Einführung in Python Web Application Homebrew für Webingenieure im 3. Jahr, die langsam sind"
Aktualisiert "Einführung in Python Web Application Homebrew für Webingenieure im 3. Jahr, die langsam sind"
Aktualisiert "Einführung in Python Web Application Homebrew für Webingenieure im 3. Jahr, die langsam sind"
[Einführung in die Udemy Python3 + -Anwendung] 43. for else-Anweisung
Einführung in Python For, While
[Einführung in die Udemy Python3 + -Anwendung] 42. für Anweisung, break-Anweisung und continue-Anweisung
[Einführung in die Udemy Python3 + -Anwendung] 58. Lambda
[Einführung in die Udemy Python3 + -Anwendung] 31. Kommentar
[Einführung in die Udemy Python3 + -Anwendung] 57. Decorator
[Einführung in die Udemy Python3 + -Anwendung] 56. Abschluss
[Einführung in die Udemy Python3 + -Anwendung] 59. Generator
[Einführung in die Udemy Python3 + -Anwendung] Zusammenfassung
Erste Schritte mit Python für Nicht-Ingenieure
Leicht verständliche Erklärung der Python-Webanwendung (Django) auch für Anfänger (5) [Einführung in den DB-Betrieb mit Django-Shell]
[Einführung in die Udemy Python3 + -Anwendung] 18. Listenmethode
[Einführung in die Udemy Python3 + -Anwendung] 63. Notation zur Einbeziehung des Generators
[Einführung in die Udemy Python3 + -Anwendung] 28. Kollektiver Typ
[Einführung in die Udemy Python3 + -Anwendung] 25. Wörterbuchmethode
[Einführung in die Udemy Python3 + -Anwendung] 33. if-Anweisung
[Einführung in die Udemy Python3 + -Anwendung] 13. Zeichenmethode
[Einführung in die Udemy Python3 + -Anwendung] 55. In-Function-Funktionen
[Einführung in die Udemy Python3 + -Anwendung] 48. Funktionsdefinition
[Einführung in die Udemy Python3 + -Anwendung] 10. Numerischer Wert
[Einführung in die Udemy Python3 + -Anwendung] 21. Taple-Typ
[Einführung in die Udemy Python3 + -Anwendung] 45. Aufzählungsfunktion
[Einführung in die Udemy Python3 + -Anwendung] 41. Eingabefunktion
[Einführung in die Udemy Python3 + -Anwendung] 17. Listenoperation
[Einführung in die Udemy Python3 + -Anwendung] 65. Ausnahmebehandlung
[Einführung in die Udemy Python3 + -Anwendung] 11. Zeichenkette
[Einführung in die Udemy Python3 + -Anwendung] 44. Bereichsfunktion
[Einführung in die Udemy Python3 + -Anwendung] 46. Zip-Funktion
[Einführung in die Udemy Python3 + -Anwendung] 24. Wörterbuchtyp
[Python] Webanwendungsdesign für maschinelles Lernen
Eine Einführung in Python für maschinelles Lernen
[Einführung in die Udemy Python3 + -Anwendung] 8. Variablendeklaration
[Einführung in die Udemy Python3 + -Anwendung] 29. Methode festlegen
[Einführung in die Udemy Python3 + -Anwendung] 16. Listentyp
[Einführung in die Udemy Python3 + -Anwendung] 61. Wörterbucheinschlussnotation
[Einführung in die Udemy Python3 + -Anwendung] 22. Auspacken der Taples
Eine Einführung in Python für C-Sprachprogrammierer
[Einführung in die Udemy Python3 + -Anwendung] 47. Verarbeiten Sie das Wörterbuch mit einer for-Anweisung
Lassen Sie uns die kostenlose "Einführung in Python für maschinelles Lernen" bis zum 27. April online stellen
Eine Einführung in selbst erstellte Python-Webanwendungen für einen trägen Webingenieur im dritten Jahr
Leicht verständliche Erklärung der Python-Webanwendung (Django) auch für Anfänger (4) [Einführung in Routing-Einstellungen und MTV-Entwurfsmuster]
Auf Python 2.7.9 aktualisiert
[Einführung in die Udemy Python3 + -Anwendung] 26. Kopie des Wörterbuchs
[Einführung in die Udemy Python3 + -Anwendung] 60. Listeneinschlussnotation
[Einführung in die Udemy Python3 + -Anwendung] 19. Kopie der Liste
[Einführung in die Udemy Python3 + -Anwendung] 38. Bei der Beurteilung von None
Einführung in Tornado (1): Python Web Framework mit Tornado gestartet
[Einführung in die Udemy Python3 + -Anwendung] 40. while else-Anweisung
[Einführung in die Udemy Python3 + -Anwendung] 62. Legen Sie die Einschlussnotation fest
Schritte zum Entwickeln einer Webanwendung in Python
[Einführung in die Udemy Python3 + -Anwendung] 64. Namespace und Gültigkeitsbereich
[Einführung in Python3 Tag 20] Kapitel 9 Enträtseln des Webs (9.1-9.4)
[Einführung in Udemy Python3 + Application] 67. Befehlszeilenargumente
[Einführung in die Udemy Python3 + -Anwendung] 9. Drucken Sie zunächst mit print