Aktualisiertes Kapitel "Mehrere HTTP-Anfragen können wiederholt beantwortet werden" (https://zenn.dev/bigen1925/books/introduction-to-web-application-with-python/viewer/daemonize) ..
Wenn Sie mehr lesen möchten, "mögen" oder "folgen Sie mir" in Buch ;-)
Das Folgende ist ein Auszug aus dem Inhalt des Buches.
Es ist Zeit, sich mit diesem Problem zu befassen.
Die bisher erstellten Webserver werden beendet, sobald Sie eine einzelne HTTP-Anforderung verarbeiten.
Daher müssen Sie den Server jedes Mal neu starten, wenn Sie auf wiederholte Anforderungen antworten möchten.
Es kann ärgerlich sein, den Server jedes Mal zu starten, wenn Sie den Vorgang während der Entwicklung überprüfen. Es gibt jedoch auch ein Problem bei der normalen Anzeige einer allgemeinen Webseite.
Versuchen Sie beispielsweise, die im vorherigen Kapitel erstellte index.html wie folgt zu ändern.
study/static/index.html
<!doctype html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>HenaServer</title>
<link rel="stylesheet" href="index.css">
</head>
<body>
<img alt="logo" src="logo.png ">
<h1>Welcome to HenaServer!</h1>
</body>
</html>
https://github.com/bigen1925/introduction-to-web-application-with-python/blob/main/codes/chapter12/static/index.html
Zeile 6: <link rel =" stylesheet "href =" index.css ">
Zeile 10: <img alt =" logo "src =" logo.png ">
Hinzugefügt.
Gemeinsames Lesen externer CSS-Dateien und Bilddateien.
Bereiten Sie als Nächstes eine neue Datei vor, die im selben Verzeichnis gelesen werden soll.
Der Inhalt der CSS-Datei lautet wie folgt.
study/static/index.css
h1 {
color: red;
}
https://github.com/bigen1925/introduction-to-web-application-with-python/blob/main/codes/chapter12/static/index.css
Die Bilddatei ist hier.
study/static/logo.png
https://github.com/bigen1925/introduction-to-web-application-with-python/blob/main/codes/chapter12/static/logo.png
Die Bilddatei kann alles sein, aber in diesem Buch ist sie von "Irasutoya" ^ [https://www.irasutoya.com/] entlehnt. Sie können jedes beliebige Bild verwenden.
Wie Sie sehen können, sollte Chrome auf einer normalen Webseite das Logo anzeigen und der Text sollte CSS angewendet und rot angezeigt werden.
Starten wir nun den Server und greifen in Chrome auf "http: // localhost: 8080 / index.html" zu.
Das ist nicht gut. Es wird kein Bild oder CSS geladen.
Wenn der Browser die Antwort vom Webserver empfängt, verweist er auf die externe Datei im HTML-Code des Antworttextes (<img src =" ">
, <script src =" ">
, <link href =" ">
Usw.) wird versucht, den Dateiinhalt erneut abzurufen, indem die Anforderung erneut gesendet wird.
Unser Webserver kann jedoch keine zusätzlichen Anforderungen (in diesem Fall CSS- und Image-Anforderungen) verarbeiten, da das Programm unmittelbar nach der Verarbeitung der ersten Anforderung beendet wird.
Schauen wir uns diese Situation genauer an.
Chrome verfügt über eine Funktion namens "Developer Tools", mit der Sie die Kommunikationsergebnisse von HTTP-Anforderungen detailliert anzeigen können. Wir werden das verwenden, um den aktuellen Status der Anfrage zu überprüfen.
Drücken Sie auf dem Bildschirm, auf dem Sie zuvor in Chrome auf "http: // localhost: 8080 / index.html" zugegriffen haben, "Strg" + "Umschalt" + "j". (Oder klicken Sie mit der rechten Maustaste auf den Bildschirm und wählen Sie "Überprüfen", um die Registerkarte "Konsole" zu öffnen.)
Wie in der Abbildung gezeigt, wird beim Abrufen von "index.css" und "logo.png " ** ein Fehlerprotokoll angezeigt, das angibt, dass die Verbindung zum Webserver fehlgeschlagen ist. ** **.
(Chrome ist auch so konzipiert, dass es schwierig ist, das Image von Fabicon ohne Anweisungen zu erhalten, und dieser Fehler wird ebenfalls angezeigt, aber Sie müssen sich in diesem Buch nicht darum kümmern. .)
Öffnen Sie als Nächstes die Registerkarte "Netzwerk" der Entwicklertools, * starten Sie den Server und * laden Sie ihn neu. (Die Registerkarte "Netzwerk" muss neu geladen werden, da nach dem Öffnen der Entwicklertools nur Informationen für die nachfolgende Kommunikation angezeigt werden.)
Sie können sehen, dass Chrome insgesamt 4 Mitteilungen durchführt, um diese Seite anzuzeigen. (Der Inhalt kann je nach Version und Umgebung variieren.)
In der Aufschlüsselung war die Kommunikation zum Abrufen von "index.html" erfolgreich ("status" ist "200"), und "index.css" und "logo.png " schlugen fehl ("status") Sie können sehen, dass "fehlgeschlagen" ist).
Es stellte sich heraus, dass es nicht nur "nur nervig" ist, sondern es auch nicht möglich ist, auch nur eine normale Webseite mit CSS, Bildern, JS usw. anzuzeigen.
Verbessern wir jetzt unseren Webserver, um diese Probleme zu lösen.
Erstens ist es möglich, auf wiederholte Anfragen zu antworten, indem der Prozess des Verbindungsaufbaus und der Rückgabe einer Antwort in eine Endlosschleife gestellt wird.
Der Quellcode ist hier.
study/WebServer.py
https://github.com/bigen1925/introduction-to-web-application-with-python/blob/main/codes/chapter12/WebServer.py
while True:
Die größte Änderung besteht darin, dass der gesamte Prozess vom "Warten auf eine Verbindung vom Client" zum "Beenden der Verbindung" (Zeilen 31-97) in eine Endlosschleife gestellt wurde. (Wenn Sie die Notation der Endlosschleife nicht verstehen, überprüfen Sie dies bitte mit "python while true".)
Es ist nur eine Zeile, aber es schließt die Verarbeitung einer Anforderung ab, schließt die Verbindung und kehrt dann zum Anfang der Schleife zurück und wartet erneut auf die Anforderung. Wenn die Verarbeitung der nächsten Anforderung abgeschlossen ist, kehrt sie zum Anfang der Schleife zurück und wartet auf die nächste Anforderung.
Mit anderen Worten, das Programm verarbeitet weiterhin Anfragen auf unbestimmte Zeit, bis die Person, die das Programm startet, das Programm explizit unterbricht.
except Exception:
#Wenn während der Verarbeitung der Anforderung eine Ausnahme auftritt, wird ein Fehlerprotokoll an die Konsole und ausgegeben
#Verarbeitung fortsetzen
print("Bei der Verarbeitung der Anforderung ist ein Fehler aufgetreten.")
traceback.print_exc()
finally:
#Die TCP-Kommunikation wird geschlossen, unabhängig davon, ob eine Ausnahme auftritt oder nicht.
client_socket.close()
Übrigens habe ich die Ausnahmebehandlung hinzugefügt.
Wenn Sie keine Ausnahmen behandeln, wird das gesamte Programm angehalten, wenn eine Ausnahme in der Mitte der Schleife auftritt. Bei der Behandlung wie oben wird jedoch nur die Verarbeitung der zu diesem Zeitpunkt bearbeiteten Anforderung unterbrochen, das Programm jedoch Das Ganze geht zur nächsten Schleife, ohne anzuhalten.
Außerdem wird "close ()" von "cient_socket" in der finally-Klausel und nicht am Ende der try-Klausel ausgeführt. Wenn Sie dies am Ende der try-Klausel tun, wird das Trennen der Verbindung übersprungen, wenn in der Mitte eine Ausnahme auftritt.
Bewegen wir es tatsächlich.
Starten Sie den Server wie gewohnt von der Konsole aus.
Kapitel "Mehrere HTTP-Anfragen können wiederholt beantwortet werden"