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

Das Buch wurde aktualisiert

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.


Das Problem, dass der Webserver die Anfrage nur einmal verarbeiten kann

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.

Externe Dateien können nicht aus HTML referenziert werden

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

Ermöglicht die Bearbeitung wiederkehrender Anfragen

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.

Quellcode

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

Kommentar

30. Zeile

            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.

Zeilen 89-97

                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.

Versuche dich zu bewegen

Bewegen wir es tatsächlich.

Starten Sie den Server wie gewohnt von der Konsole aus.


Weiter mit Buch!

Kapitel "Mehrere HTTP-Anfragen können wiederholt beantwortet werden"

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"
[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
[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] 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] 41. Eingabefunktion
[Einführung in die Udemy Python3 + -Anwendung] 17. Listenoperation
[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
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] 23. Verwendung von Tapuru
[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 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 Udemy Python3 + Application] 67. Befehlszeilenargumente
Einführung in die Programmierung (Python) TA Tendenz für Anfänger
[Einführung in die Udemy Python3 + -Anwendung] 54. Was ist Docstrings?
[Einführung in die Udemy Python3 + -Anwendung] 37. Technik zur Beurteilung, dass es keinen Wert gibt
[Einführung in die Udemy Python3 + -Anwendung] 14. Zeichensubstitution 15.f-Strings
Grundlegendes zur Python for Pepper-Entwicklung. -Einführung in Python Box-
[Einführung in die Udemy Python3 + -Anwendung] 35. Vergleichsoperatoren und logische Operatoren
[Einführung in die Udemy Python3 + -Anwendung] 66. Erstellen einer eigenen Ausnahme
(Python) Versuchen Sie, eine Webanwendung mit Django zu entwickeln
[Einführung in Python] Hochgeschwindigkeits-Einführung in Python für vielbeschäftigte C ++ - Programmierer
[Einführung in Udemy Python3 + Application] 53. Wörterbuch der Schlüsselwortargumente