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.
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.
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
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.
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.
Wenn Sie wissen, was Sie tun möchten, ist der Quellcode nicht schwierig. Verschieben Sie ihn also sofort.
Kapitel "HTML-Dateien verfügbar machen"
Recommended Posts