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

Das Buch wurde aktualisiert

Kapitel "Sie können" dynamisch generiertes HTML "zurückgeben ) Das 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.


"Statische Dateizustellung" und "Dynamische HTML-Generierung"

Inzwischen können Sie "entsprechende Header generieren" ("Datum", "Inhaltstyp" usw.), "Parallelverarbeitung" und eine Antwort gemäß den "HTTP-Regeln" zurückgeben. Der Teil ist ziemlich gut organisiert.

Dies ist fast das Ende des Schritts ** "Wir bereiten die Mindestfunktionen als Webserver (= HTTP-Server) vor" **.

Schauen wir uns als nächsten Schritt ** "Was als Antwortkörper zurückgeben?" ** genauer an.


Die bereits implementierte Funktion "Zurückgeben des Inhalts einer HTML- oder Bilddatei als Antworttext" wird im Allgemeinen als "statische Dateiübermittlung" bezeichnet.

Mit dieser Funktion können Sie beispielsweise RFC-Webseite von IETF erstellen. Sie müssen lediglich den Inhalt in eine HTML-Datei schreiben und speichern.

Es fehlt jedoch immer noch an Funktionalität, um eine vertraute Homepage zu erstellen.

Zum Beispiel Professor Maebashis Homepage ^ [Ich bin der Autor von "Einführung in die Entwicklung von Webanwendungen aus den Grundlagen des Lernens beim Erstellen eines Webservers", der mir die Möglichkeit gab, dieses Buch zu schreiben. Für weitere Informationen ist es relativ einfach wie hier] ^ [Mr. Maebashi, es tut mir leid. ] Ich kann noch nicht einmal eine Homepage erstellen.

Was nicht gemacht werden kann, ist der sogenannte "Zugangszähler" -Teil, wie unten gezeigt.

Die Zahl auf dem Zugriffszähler erhöht sich, wenn Sie die Seite laden. Wie können Sie diese Funktionalität auf Ihrem aktuellen Webserver erreichen?

Wenn sich die Nummer auf dem Zugriffszähler ändert, bedeutet dies, dass sich der Inhalt des Antwortkörpers ändert. Der vom aktuellen Webserver zurückgegebene Antworttext entspricht dem Inhalt der HTML-Datei. Wenn Sie also den Inhalt des Antworttextes ändern möchten, müssen Sie die HTML-Datei bearbeiten.

Mit anderen Worten, wenn Sie diese Funktion bereitstellen möchten, benötigen Sie eine Funktion zum automatischen (oder manuellen) Bearbeiten und Speichern der HTML-Datei bei jedem Eingang einer HTTP-Anforderung. Dies scheint zu ineffizient (obwohl machbar) und ärgerlich.

Wenn das passiert, ** "Ist es nicht einfach, jedes Mal einen anderen Antworttext zu generieren, wenn Sie ihn als Python-Zeichenfolge generieren, anstatt den Antworttext aus einer Datei abzurufen?" ** Es wäre natürlich, das zu denken.

Dies wird als ** "Dynamic HTML Generation" ** (oder ** "Dynamic Response Generation" **) bezeichnet.

Spalten: "Statisch" und "Dynamisch"

Das Wort "statisch" ist ziemlich nervig. Ebenso nervig ist auch das Synonym "dynamisch".

"Statisch" bedeutet "Dinge, die sich nicht ändern" und "dynamisch" bedeutet "Dinge, die sich ändern", aber "** was ist statisch ** für was" und "** was Andererseits sollten Sie immer wissen, was dynamisch ist **.


Zum Beispiel bedeutet "statische Datei" Zustellung "Zustellung einer unveränderten Datei". Was ist das für eine Datei, die sich nicht ändert ** für was?

Die HTML-Datei selbst kann sich jederzeit ändern. Bearbeiten Sie die Datei einfach mit einem Editor. Selbst wenn dies als Funktion des Webservers betrachtet wird, ändert sich der Antworttext, wenn Sie die HTML-Datei bearbeiten.

Einige Leute beschreiben "statische Dateizustellung" als "einen Webdienst, der" immer "dieselbe Antwort zurückgibt", aber dies macht ihn ungenau. Wenn Sie die HTML-Datei bearbeiten, ändert sich die Antwort.

Die Antwort lautet "** Zustellung von Dateien, deren Inhalt sich als Antwort auf Anfragen nicht ändert". Es kann einfacher sein zu sagen, "eine Datei zu liefern, deren Inhalt auf Anfrage nicht geändert wird".

Wenn Sie also eine Datei bearbeiten, kann sich der Inhalt ändern.

Als ich ein Junioringenieur war "Aber wenn Sie die HTML-Datei bearbeiten, ändert sich die Antwort. Ist sie nicht immer dieselbe?" Ich war verwirrt.


Darüber hinaus wird Javascript bei der Beschreibung manchmal als "Programmiersprache für die Bereitstellung dynamischer Inhalte im Web" bezeichnet. "Dynamischer Inhalt" in dieser Beschreibung bedeutet "Inhalt, der ** den gelieferten HTML-Code ** im Laufe der Zeit oder der Benutzerinteraktion ändert" ^ [Um genau zu sein, ändert Javascript ihn. Es ist DOM, nicht HTML, aber es ist süß. ].

Sobald der im Browser anzuzeigende HTML-Code als Antwort an den Browser gesendet wurde, ist es grundsätzlich unmöglich, ihn über das Programm auf der Serverseite zu ändern. CSS usw. ändern zwar den Anzeigeinhalt des Inhalts (machen die Textfarbe rot), aber den Inhalt des gelieferten HTML-Codes nicht.

Wenn Sie das Programm jedoch zusammen mit dem HTML-Code an den Browser senden, kann der Browser das Programm später ausführen, um den gelieferten HTML-Code zu ändern. Das ist Javascript.

Wenn Sie "dynamischen Inhalt" einfach als "Ändern einer Webseite" verstehen, "Bietet CSS, das die Farbe von Text ändert, nicht auch dynamischen Inhalt?" "Das HTML-Formular-Tag ist auch dynamisch, da sich das Verhalten der Seite abhängig davon ändert, ob die Schaltfläche gedrückt wird oder nicht." Es wird verwirrend sein. (Ich war verwirrt.)


Wie Sie sehen können, werden häufig die Wörter "statisch" und "dynamisch" verwendet, die jedoch schwer zu verstehen sind. Achten Sie daher immer darauf, was sich ändert / nicht ändert.

Erstellen Sie eine Seite, auf der die aktuelle Uhrzeit angezeigt wird

Ich habe es ein wenig umständlich erklärt, aber es kann schneller sein, im Quellcode nachzuschauen, was Sie tun möchten.

Lassen Sie uns tatsächlich eine "dynamische HTML-Generierung" durchführen und eine Seite erstellen, deren Ergebnis sich jedes Mal ändert, wenn Sie es anfordern.

Um den Zugriffszähler plötzlich zu implementieren, benötigen Sie so etwas wie eine Datenbank, in der die Anzahl der vergangenen Zugriffe gespeichert ist. Dies ist etwas mühsam. Der Einfachheit halber greifen Sie zuerst auf den Pfad ** / now zu, um die aktuelle Uhrzeit anzuzeigen. Lassen Sie uns eine Seite erstellen, die nur **.

(Ich werde etwas später an der Implementierung des Zugriffszählers arbeiten.)

Quellcode

Hier ist der Quellcode, der workerthread.py geändert hat, um eine Seite hinzuzufügen, auf der die aktuelle Uhrzeit angezeigt wird.

study/workerthread.py https://github.com/bigen1925/introduction-to-web-application-with-python/blob/main/codes/chapter14/workerthread.py

Kommentar

Zeilen 42-59

            response_body: bytes
            response_line: str
            #Weg ist/Generieren Sie jetzt HTML, das die aktuelle Uhrzeit anzeigt
            if path == "/now":
                html = f"""\
                    <html>
                    <body>
                        <h1>Now: {datetime.now()}</h1>
                    </body>
                    </html>
                """
                response_body = textwrap.dedent(html).encode()

                #Generieren Sie eine Antwortzeile
                response_line = "HTTP/1.1 200 OK\r\n"

            #Wenn der Pfad anders ist, generieren Sie eine Antwort aus einer statischen Datei
            else:
                # ...

Dies ist der Teil, den ich hinzugefügt habe.

Was machst du ** "Wenn path / now ist, generieren Sie HTML, das die aktuelle Uhrzeit mit Python anzeigt, und verwenden Sie es als Antworttext" ** darüber.


Hier sind einige Ergänzungen zum Quellcode.

            response_body: bytes
            response_line: str

Da der Platz zum Ersetzen von "response_body" und "response_line" in mehrere Teile unterteilt ist, habe ich mich entschlossen, im Voraus eine Typanmerkung vorzunehmen.

Die Annotation des Variablentyps hat die Bedeutung, Editoren usw. einen Hinweis zu geben: "Diese Variable soll einen Wert dieses Typs zuweisen." Wenn Sie es so schreiben, werden Sie vom Editor im Voraus gewarnt, wenn Sie fälschlicherweise "Ersatz" str "dort drüben," Bytes "hier ersetzen" sagen.

                html = f"""\
                    <html>
                    <body>
                        <h1>Now: {datetime.now()}</h1>
                    </body>
                    </html>
                """
                response_body = textwrap.dedent(html).encode()

Ich benutze here document +dedent (). Ich möchte nur gewöhnliches HTML schreiben, aber Einrückungen und Zeilenumbrüche haben in Python eine Bedeutung, also entwerfe ich es. Es ist nicht so schwierig, also schau es dir in "python here document", "python dedent" usw. an.

Versuche dich zu bewegen

Bewegen wir es jetzt.

Versuchen Sie nach dem normalen Starten des Servers, in Chrome auf "http: // localhost: 8080 / now" zuzugreifen.

Es ist einfach, aber haben Sie eine Seite wie die oben gezeigte gesehen?

Wenn Sie es sehen, versuchen Sie mehrmals, die Seite neu zu laden. Ändert sich der angezeigte Inhalt jedes Mal?


Damit ist die dynamische HTML-Generierung abgeschlossen. Es war einfach.

Rückblickend ist der wichtige Punkt, den ich diesmal gemacht habe, der ** "Nach dem Starten des Servers habe ich den Quellcode oder die HTML-Datei überhaupt nicht bearbeitet, aber das Ergebnis ist jedes Mal anders." ** darüber.

Dies ist eine Funktion, die nicht durch einfaches Ausgeben des Inhalts der Datei als Antworttext realisiert werden konnte.

Erstellen Sie eine Seite, um den Inhalt der HTTP-Anforderung anzuzeigen

Da es eine große Sache ist, erstellen wir eine weitere dynamische HTML-Seite.

Als Nächstes fügen wir eine Seite mit dem Namen "/ show_request" hinzu, auf der der Inhalt der gesendeten HTTP-Anforderung in HTML angezeigt wird.


Weiter mit Buch!

Kapitel "Sie können" dynamisch generiertes HTML "zurückgeben )

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] 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] 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 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