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)
directoryEen string, os. Pathlike, of een lijst met strings of os. Pathlike die een directorypad vertegenwoordigt.context_processorsEen 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.