Templates
Starlette ist nicht ausschließlich mit einer bestimmten Template-Engine gekoppelt, aber Jinja 2 ist eine ausgezeichnete Wahl.
Jinja 2 Vorlagen
Unterzeichnung: Jinja2Templates(directory, context_processors=None, **env_options)
directory- Eine Zeichenfolge, os. Pathlike, eine Zeichenfolge oder eine Liste von os. Pathlike, die einen Verzeichnispfad darstellt.context_processors- Eine Liste von Funktionen, die das Wörterbuch zurückgeben, um dem Template-Kontext hinzugefügt zu werden.**env_options- Zusätzliche Schlüsselwortparameter, die an die Jinja2-Umgebung übergeben werden.
Starlette bietet eine einfache Möglichkeit, die jinja2-Konfiguration durchzuführen, die Sie wahrscheinlich standardmäßig verwenden möchten.
von starlette. applications import Starlette
Routing import Route, Mount von Starlette
starlette. templating import Jinja2Templates (Deutsche Übersetzung)
from starlette. staticfiles import StaticFiles (etwa: Statistische Dateien importieren)
Templates = Templates (Verzeichnis = Templates)
async def Homepage (Anforderung):
return templates. TemplateResponse (request,'index.html') zurück
Die Bahn […]
Route ('/', endpoint = homepage), oder
Mount ('/static', StaticFiles (Verzeichnis ='static'), Name ='static')[Bearbeiten | Quelltext bearbeiten]
]
Starlette (debug = true, routes = routes) ist eine
Beachten Sie, dass die übergebene request-Instanz als Teil des Template-Kontexts aufgenommen werden muss.
Der Jinja2-Vorlagenkontext enthält automatisch eine url_for-Funktion, so dass wir innerhalb der Anwendung korrekt Links zu anderen Seiten erstellen können.
Zum Beispiel können wir eine statische Datei aus unserer HTML-Vorlage heraus verknüpfen:
<link href="{{ url_for('static', path='/css/bootstrap.min.css') }}" rel="stylesheet" />
Wenn Sie einen benutzerdefinierten Filter verwenden möchten, müssen Sie das env-Attribut von Jinja2Templates aktualisieren:
von commonmark import commonMark
starlette. templating import Jinja2Templates (Deutsche Übersetzung)
def marked_filter (text)(Beispiel):
return commonmark (Text) Zurück
Templates = Templates (Verzeichnis = Templates)
templates. env. filters 'marked']= marked_filter für Wintergarten
Benutzerdefinierte jinja2.environment Beispiele verwenden
Starlette akzeptiert auch eine vorkonfigurierte jinja2.Environment Instanz.
Der Import von Jinja2
starlette. templating import Jinja2Templates (Deutsche Übersetzung)
env = jinja2-Umgebung (...)
Templates = Jinja2Templates (env = env) und
Unterhalb des Prozessors
Ein Kontextprozessor ist eine Funktion, die ein Dictionary zurückgibt, das im Template-Kontext kombiniert werden soll, wobei jede Funktion nur einen Parameter request akzeptiert und ein Dictionary zurückgeben muss, das zum Kontext hinzugefügt werden soll.
Ein häufiger Anwendungsfall für Vorlagenprozessoren ist die Verwendung gemeinsam genutzter Variablen zur Erweiterung des Vorlagenkontexts.
Importieren von Typisierung
from starlette. requests import Request (Eingabeaufforderung)
def app_context (request: Request)-> typing. Dict [str, typing. Any]: def app_context (request: Request)-> typing. Dict [str, typing. Any]:
return Zurück {'app': request.app}
Registriert unten Muster
Übergeben Sie den Kontext-Prozessor an den context_processors-Parameter der Jinja2Templates-Klasse.
Importieren von Typisierung
from starlette. requests import Request (Eingabeaufforderung)
starlette. templating import Jinja2Templates (Deutsche Übersetzung)
def app_context (request: Request)-> typing. Dict [str, typing. Any]: def app_context (request: Request)-> typing. Dict [str, typing. Any]:
return Zurück {'app': request.app}
@ Jutta: -(
directory ='templates', context_processors =[app_context](Verzeichnis für Templates)
)
!!! Informationen werden als asynchrone Funktionen des Hintergrundprozessors nicht unterstützt .
Test-Modell reagiert .
Bei Verwendung des Testclients enthält die Vorlagenantwort die Eigenschaften .template und .context.
von starlette . testclient import TestClient
def test _ homepage () : Die Webseite
client = Testclient (Anwendung)
Antwort = client . get ("/" oder ")
assert response . status _ code = 200 Zeichen
Assert abgebenresponse.template.name= = ' index.html ' oder
assert " request " in Antwort auf . context
Anpassungen einer Jinja2 - Umgebung
Jinja2Templates akzeptiert alle von Jinja2 Environment unterstützten Optionen Dies ermöglicht mehr Kontrolle über die von Starlette erstellten Environment-Instanzen .
Eine Liste der Optionen , die für Environment verfügbar sind , finden Sie in der Jinja2 - Dokumentation hier .
starlette . templating import Jinja2Templates (Deutsche Übersetzung)
Templates = Jinja2Templates (directory ='templates', autoescape = False , auto _ reload = True) oder
Ungleiche Muster aufschlagen
Jinja 2 unterstützt asynchrones Template-Rendering , aber im Allgemeinen empfehlen wir , dass Ihre Vorlagen keine Logik enthalten , die eine Datenbanksuche oder andere I/O-Operationen aufruft .
Stattdessen empfehlen wir , dass Sie sicherstellen , dass Ihre Endpunkte alle E/A ausführen , z . B . alle Datenbankabfragen innerhalb der Ansicht streng auswerten und das Endergebnis in den Kontext einbeziehen .