Ga naar inhoud

Templates

Starlette is niet strikt gekoppeld aan een bepaalde sjabloonengine, maar Jinja2 is een uitstekende keuze.

Jinja2 sjabloon

Handtekening: Jinja2Templates(directory, context_processors=None, **env_options)

  • directory Een string, os. Pathlike, of een lijst met strings of os. Pathlike die een directorypad vertegenwoordigt.
  • context_processors Een lijst met functies die een woordenboek retourneren om toe te voegen aan de sjablooncontext.
  • **env_options - Aanvullende zoekwoordargumenten doorgegeven aan de Jinja2-omgeving.

Starlette biedt een gemakkelijke manier om jinja2 configuratie te doen. Dit kan zijn wat u standaard wilt gebruiken.

Starlette.applicaties importeren vanuit Starlette
Van starlette. routing importeren Route, Mount
Vanaf starlette.templating importeren Jinja2Templates
Importeer StaticFiles vanuit starlette.staticfiles


Sjablonen = Jinja2Sjablonen (map = 'sjablonen')

Async def homepage (aanvraag):
    Sjablonen retourneren. TemplateResponse (verzoek, 'index.html')

Routes = [
    Route ('/', eindpunt = startpagina),
    Mount ('/ statisch', StaticFiles (directory = 'statisch'), naam = 'statisch')
]

App = Starlette (debug = Waar, routes = routes)

Houd er rekening mee dat de inkomende request-instantie moet worden opgenomen als onderdeel van de sjablooncontext.

De Jinja2-sjablooncontext bevat automatisch een url_for-functie, zodat we correct kunnen hyperlinken naar andere pagina 's in de applicatie.

We kunnen bijvoorbeeld vanuit onze HTML-sjabloon linken naar statische bestanden:

<link href="{{ url_for('static', path='/css/bootstrap.min.css') }}" rel="stylesheet" />

Als u aangepaste filters wilt gebruiken, moet u de eigenschap env van Jinja2Templates bijwerken:

Van gemeengoed import gemeengoed
Vanaf starlette.templating importeren Jinja2Templates

Def gemarkeerd _ filter (tekst):
    Gewoonmerk teruggeven (tekst)

Sjablonen = Jinja2Sjablonen (map = 'sjablonen')
Templates.env.filters ['gemarkeerd'] = gemarkeerd _ filter

Gebruik een aangepaste jinja2. Omgevingsinstantie

Starlette accepteert ook een vooraf geconfigureerde jinja2.Environment-instantie.

Invoer jinja2
Vanaf starlette.templating importeren Jinja2Templates

Env = jinja2. Omgeving (...)
Sjablonen = Jinja2Sjablonen (env = env)

context handler

De contexthandler is een functie die een woordenboek retourneert om in de sjablooncontext op te nemen. Elke functie heeft slechts één argument nodig,request, en moet een woordenboek retourneren om aan de context te worden toegevoegd.

Een veelvoorkomende use-case voor sjabloonhandlers is het uitbreiden van de sjablooncontext met gedeelde variabelen.

Typen importeren
Van starlette. aanvragen import aanvragen

Def app _ context (verzoek: verzoek) - > typen. Dict [str, typen. Elke]:
    Terugkeer {'app': request.app}

Registratie context sjabloon

Geef de contexthandler door aan de context_processors-parameter van de Jinja2Templates-klasse.

Typen importeren

Van starlette. aanvragen import aanvragen
Vanaf starlette.templating importeren Jinja2Templates

Def app _ context (verzoek: verzoek) - > typen. Dict [str, typen. Elke]:
    Terugkeer {'app': request.app}

Sjablonen = Jinja2Sjablonen (
    Directory = 'sjablonen', context _ processors = [app _ context]
)

!!! Informatie, asynchrone functies als contexthandlers worden niet ondersteund.

test template reactie

Bij gebruik van de testclientzijde omvat de sjabloonreactie de kenmerken .template en .context.

Vanaf starlette.testclient importeren TestClient


Def test _ startpagina ():
    Opdrachtgever = TestClient (app)
    Reactie = client.get ("/")
    Antwoord. status _ code = = 200
    Beweren response.template.name = = 'index.html'
    Bevestig "verzoek" in response.context

Het aanpassen van de Jinja2 omgeving

Jinja2Templates accepteert alle opties die door Jinja2 Environment worden ondersteund. Dit zal meer controle mogelijk maken over Environment-instanties die door Starlette zijn gemaakt.

Voor een lijst met beschikbare opties voor Environment, kunt u de Jinja2-documentatie hier bekijken

Vanaf starlette.templating importeren Jinja2Templates


Sjablonen = Jinja2Templates (map = 'sjablonen', autoescape = Onwaar, auto _ reload = Waar)

asynchrone sjabloonweergave

Jinja2 ondersteunt asynchrone sjabloonweergave, maar over het algemeen raden we u aan geen logica op te nemen voor het aanroepen van database-zoekopdrachten of andere I / O-bewerkingen in uw sjablonen.

Integendeel, we raden u aan ervoor te zorgen dat uw eindpunten alle I / O uitvoeren, bijvoorbeeld door alle databasequery 's binnen een view rigoureus te evalueren en de eindresultaten in context op te nemen.