[PYTHON] Einführung in Tornado (2): Einführung in die Entwicklung mit Vorlagen - Dynamische Seitengenerierung -

Einführung

In dieser Reihe werden wir vorstellen, wie Anwendungen mit Tornado entwickelt werden, einem Webserver- und Webanwendungsframework, das auf Python ausgeführt wird. Der Inhalt dieser Reihe ist wie folgt.

In diesem zweiten Teil werden wir die dynamische Seitengenerierung mithilfe von Vorlagen vorstellen.

Zielgruppe

Erforderliche Umgebung

In Verbindung stehender Artikel

Beispielcode

Letzte Überprüfung

In Vorheriger Artikel habe ich den folgenden Code erstellt, um Hello World anzuzeigen.

app.py


import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")

application = tornado.web.Application([
    (r"/", MainHandler),
])

if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.current().start()

Wenn Sie im obigen Code eine GET-Anforderung an [http: // localhost: 8888 /](http: // localhost: 8888 /) senden, gibt die get-Methode von MainHandler die Zeichenfolge "Hello, World" zurück und zeigt sie im Browser an. Es war zu tun. Wenn jedoch nur feste Werte zurückgegeben und wie im obigen Code angezeigt werden, ist es nicht möglich, eine flexible Anwendung zu erstellen, die die Anzeige entsprechend den Benutzereingaben ändert. Zu diesem Zweck können die meisten Webanwendungs-Frameworks, einschließlich Tornado, Seiten dynamisch programmgesteuert generieren. Dieses Mal werde ich die Funktion zum dynamischen Generieren von Seiten in Tornado einführen. Die Schlüsselwörter hier sind die folgenden zwei.

Im Folgenden werden zunächst die Vorlage und die Vorlagen-Engine erläutert und anschließend die Seite dynamisch generiert.

Vorlagen und Vorlagen-Engine

** Eine Vorlage ist eine Vorlage **. Vorlagen in der Entwicklung von Webanwendungen bestehen aus Teilen, die sich ändern, und Teilen, die sich nicht ändern. Betten Sie von diesen eine Zeichenfolge ein, die in den sich ändernden Teil ersetzt werden soll, und binden Sie die Daten aus dem Programm nach Bedarf ein. Zu diesem Zeitpunkt wird die Vorlagen-Engine verwendet, um die Daten zu ersetzen. ** Mit anderen Worten, die Vorlagen-Engine ist ein Mechanismus, der die in die Vorlage eingebettete sich ändernde Zeichenfolge ersetzt und eine neue Zeichenfolge erstellt **.

Nehmen wir ein einfaches Beispiel. Das Folgende ist eine Beispielvorlage.

example1.html


<html>
  <head>
    <title>{{ title }}</title>
  </head>
  <body>
    <ul>
      {% for item in items %}
        <li>{{ item }}</li>
      {% end %}
    </ul>
  </body>
</html>

Wie Sie oben sehen können, sind die Vorlagen hauptsächlich HTML. ** Tornado-Vorlagen bestehen aus Kontrollstrukturen und Ausdrücken, die in das Markup eingebettet sind. ** Diese Vorlage enthält einige Teile, die sich ändern, und einige Teile, die sich nicht ändern. Was sich ändert, ist der Teil, der von {{title}} und {% für%} {% end%} umgeben ist, der von Wellenklammern umgeben ist, und was sich nicht ändert, ist der Teil des HTML-Tags.

Sie können eine neue Zeichenfolge erstellen, indem Sie Daten an die Vorlagen-Engine übergeben, um die obige Vorlage zu ersetzen. Wenn Sie beispielsweise ** Obstliste ** als ** {{title}} ** und ** ['Apfel', 'Orange', 'Traube'] ** als ** Artikel ** übergeben, wird jeder Teil ersetzt. Wird generiert und die folgende Zeichenfolge wird generiert.

example2.html


<html>
  <head>
    <title>Fruits List</title>
  </head>
  <body>
    <ul>
      <li>apple</li>
      <li>orange</li>
      <li>grape</li>
    </ul>
  </body>
</html>

Wenn Sie die Vorlagenfunktion gut nutzen, können Sie effizient entwickeln, indem Sie die Teile, die sich ändern, und die Teile, die sich nicht ändern, trennen.

Anwendung zu erstellen

Dieses Mal erstellen wir eine Anwendung, die so etwas wie "Hallo, dein Name!" Anzeigt, wenn sie einen Namen erhält. Es ist eine einfache Anwendung, aber durch die Erstellung dieser Anwendung werden Sie die Grundlagen der dynamischen Seitengenerierung verstehen. Das Bild der Anwendung ist wie folgt. スクリーンショット 2015-10-26 16.01.02.png

Hier übergeben wir die Zeichenfolge Hironsan als Namen.

Verzeichnisaufbau

Bevor wir uns den Code ansehen, schauen wir uns zunächst diese Verzeichnisstruktur an. Diesmal ist die Verzeichnisstruktur wie folgt.

.
├── app.py
├── static
│   └── style.css
└── templates
    └── index.html

Der Hauptunterschied zu Last time besteht darin, dass es ** statische ** und ** Vorlagenverzeichnisse ** gibt. Dieses Mal wird die Datei style.css statisch und die Datei index.html in Vorlagen gespeichert. Die allgemeine Verwendung dieser Verzeichnisse besteht darin, HTML-Dateien im Vorlagenverzeichnis abzulegen und CSS-Dateien, JavaScript-Code, Bilder usw. separat im statischen Verzeichnis zu speichern.

Aus dem Obigen können die Komponenten dieser Anwendung in die folgenden drei unterteilt werden.

Beginnen wir mit dem Python-Code.

Python-Code

Der diesmal auszuführende Python-Code lautet wie folgt.

app.py


import os
import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        name = self.get_argument('name', 'World')
        self.render('index.html', name=name)

BASE_DIR = os.path.dirname(__file__)

application = tornado.web.Application([
        (r'/', MainHandler),
        ],
        template_path=os.path.join(BASE_DIR, 'templates'),
        static_path=os.path.join(BASE_DIR, 'static'),
)

if __name__ == '__main__':
    application.listen(8888)
    tornado.ioloop.IOLoop.current().start()

Die Hauptunterschiede zum vorherigen Code sind die folgenden drei Punkte.

template_path und static_path

Letztes Mal Wie bereits erläutert, kann das Anwendungsobjekt zum Konfigurieren der gesamten Anwendung verwendet werden. Durch Übergeben von template_path und static_path als Argumente an dieses Anwendungsobjekt teilt ** der Anwendung mit, wo sich die Vorlagen und statischen Verzeichnisse befinden. ** Wenn Sie diese nicht bestehen, weiß die Anwendung nicht, wo sich die HTML-Datei befindet. Das Laden der Vorlage usw. schlägt daher fehl und der folgende Fehler tritt auf.

FileNotFoundError: [Errno 2] No such file or directory: '/hogehoge/index.html'

render Die zuletzt verwendete Schreibmethode ist eine Methode, die eine Zeichenfolge als Argument verwendet und diese Zeichenfolge als HTTP-Antwort zurückgibt. Andererseits ist die ** Render-Methode eine Methode, die die Vorlagendatei und das angegebene Argument an die Template-Engine übergibt und die resultierende Zeichenfolge als Antwort ** sendet. Dieses Mal übergeben wir die Argumente wie folgt.

self.render('index.html', name=name)

Das erste Argument ist der Dateiname der Vorlage, und das zweite und die nachfolgenden Argumente sind die Variablen, die an die Vorlage übergeben werden. Hier lautet der Dateiname der Vorlage "index.html", und der Name wird als Variable mit dem Namen "name" übergeben. Da wir das Argument mit dem Namen name übergeben, können wir mit dem Namen name in der Vorlage darauf verweisen. Wenn dies Ihr Name = Name ist, bezeichnen Sie ihn in der Vorlage als Ihren Namen.

Schließlich habe ich den template_path im Application-Objekt festgelegt, um Tornado den Speicherort des Vorlagenverzeichnisses mitzuteilen und die Vorlagendatei von der Rendermethode zu laden.

get_argument Die Methode ** get_argument ist eine Methode ** zum Empfangen der vom Client übergebenen Parameter. Die RequestHandler-Klasse von Tornado verfügt über eine Reihe integrierter Methoden, die nützlich sind. Eines davon ist get_argument. In diesem Fall wird es beispielsweise wie folgt angegeben.

name = self.get_argument('name', 'World')

Der Wert des im ersten Argument von get_argument angegebenen Namens wird aus dem Parameter abgerufen. Wenn der Parameter nicht den im ersten Argument der Methode get_argument angegebenen Namen hat, wird der Wert des zweiten Arguments der Methode get_argument zurückgegeben. Mit anderen Worten, der Wert des zweiten Arguments legt den Standardwert fest. Wenn das zweite Argument nicht in get_argument festgelegt ist und der im ersten Argument angegebene Name nicht im Parameter vorhanden ist, tritt ein Fehler auf.

Schauen wir uns als nächstes die HTML-Datei an.

Vorlage

Die Vorlage, die dieses Mal für die Anzeige verwendet wird, lautet wie folgt.

templates/index.html


<html>
  <head>
    <title>Hello Tornado</title>
    <link rel="stylesheet" href="{{ static_url('style.css') }}" />
  </head>
  <body>
    <h1>Hello, {{ name }}!</h1>
  </body>
</html>

Können Sie sehen, dass ein Teil der Vorlage in wellenförmigen Klammern eingeschlossen ist? Diese können durch Weitergabe von Daten nach Bedarf ersetzt werden. {{name}} enthält den von der Rendermethode übergebenen Wert und {{static_url ('style.css')}} enthält den Pfad von style.css.

Die hier verwendete static_url () -Methode ** konvertiert den relativen Pfad zu der in der Methode angegebenen Datei in eine URL **. Bei der Konvertierung in eine URL wird außerdem der im Anwendungsobjekt festgelegte Wert von static_path verwendet. Denken Sie daran, dass wir dieses Mal das statische Verzeichnis als static_path festgelegt haben.

Als Beispiel für die Konvertierung mit der Methode static_url () wird static_url ('style.css') als /static/style.css und static_url ('css / style.css') als / static konvertiert. Es wird in /css/style.css konvertiert.

Schauen wir uns zum Schluss CSS an.

CSS-Datei

Die CSS-Datei, mit der diesmal der HTML-Stil angegeben wird, lautet wie folgt.

static/style.css


body {
  background-color: #FFFFE0;
}

h1 {
  background-color: #99cc00;
}

Diese CSS-Datei verwendet keine für Tornado spezifischen Funktionen, daher werde ich die Erklärung weglassen.

Lauf

Führen Sie wie beim letzten Mal den folgenden Code aus, um den Server zu starten.

$ python app.py

Gehen Sie dann zu [http: // localhost: 8888 /? Name = Ihr Name](http: // localhost: 8888 /? Name = Ihr Name). Sie sollten "Hallo, Ihr Name!" Sehen. Versuchen Sie, den Teil Ihres Namens in der URL in verschiedene Zeichenfolgen zu ändern. Sie können sehen, dass die Seite dynamisch gemäß der übergebenen Zeichenfolge generiert wird.

Zusammenfassung

Dieses Mal habe ich die dynamische Seitengenerierung mithilfe der Vorlage und der Vorlagen-Engine eingeführt. Sie können sehen, dass Sie Seiten dynamisch generieren können, indem Sie Daten aus dem Programm an die Vorlage übergeben. Dieses Mal habe ich die CSS-Datei direkt unter statisch gestellt, aber in Wirklichkeit erstelle ich oft ein CSS-Verzeichnis oder ein Stylesheet-Verzeichnis und lege die CSS-Datei darunter. Ich werde hier über die Projektstruktur sprechen. Nächstes Mal werde ich die Tornado-Vorlage im Detail vorstellen.

Referenzmaterial

Recommended Posts

Einführung in Tornado (2): Einführung in die Entwicklung mit Vorlagen - Dynamische Seitengenerierung -
Einführung in Tornado (3): Entwicklung mit Vorlagen [Übung]
Einführung in die diskrete Ereignissimulation mit Python # 1
[PyTorch] Einführung in die Dokumentklassifizierung mit BERT
Einführung in die diskrete Ereignissimulation mit Python # 2
Einführung in Python Bereiten wir die Entwicklungsumgebung vor
Einführung in Tornado (1): Python Web Framework mit Tornado gestartet
[PyTorch] Einführung in die Klassifizierung japanischer Dokumente mit BERT
Einführung in Scapy ② (ICMP, HTTP (TCP) -Übertragung mit Scapy)
Grundlegendes zur Python for Pepper-Entwicklung. -Einführung in Python Box-
Einführung in MQTT (Einführung)
Einführung in Scrapy (1)
Einführung in Scrapy (3)
Erste Schritte mit Supervisor
Einführung in Tkinter 1: Einführung
Einführung in die Kolbenentwicklung
Einführung in PyQt
Einführung in Scrapy (2)
[Linux] Einführung in Linux
Einführung in Scrapy (4)
Einführung in discord.py (2)
Aufbau der Python-Entwicklungsumgebung 2020 [Von der Python-Installation bis zur Einführung in die Poesie]
[Einführung in Python] Wie stoppe ich die Schleife mit break?
[Einführung in cx_Oracle] (13.) Verbindung über Verbindungspool (Client-Seite)
[Einführung in Python] So schreiben Sie sich wiederholende Anweisungen mit for-Anweisungen
Wovon ich süchtig war, als ich Python Tornado benutzte
[Technisches Buch] Einführung in die Datenanalyse mit Python -1 Kapitel Einführung-