Aller au contenu

Modèles

La Starlette n'est pas strictement couplée à un moteur de template particulier, mais la Jinja2 est un excellent choix.

Modèles pour Jinja2

Signé par: Jinja2Templates(directory, context_processors=None, **env_options)

  • directory - Une chaîne, os.Pathlike, ou une liste de chaînes ou os.Pathlike, représentant un chemin de répertoire.
  • context_processors - Une liste d'une série de fonctions qui renvoient un dictionnaire à ajouter au contexte du modèle.
  • **env_options - Paramètres de mots-clés supplémentaires passés à l'environnement Jinja2.

Starlette fournit un moyen simple de configurer jinja2. c'est probablement ce que vous voulez utiliser par défaut.

de starlette.applications import Starlette
de starlette.routing Route d'importation, Mont
de starlette.templating import Jinja2Templates
de starlette.staticfiles import StaticFiles


templates = Jinja2Templates(directory ="templates")

async def homepage(request):
    return templates.TemplateResponse(request, 'index.html')

Routes = [
    Route('/', endpoint=homepage),
    Mount('/static', StaticFiles(directory ='static'), name ='static')
]

app = Starlette(defg =True, routes=routes)

Notez que les instances request entrantes doivent être incluses dans le contexte du modèle.

Le contexte du modèle Jinja2 inclura automatiquement une fonction url_for afin que nous puissions hyperlien vers d'autres pages correctement dans l'application.

Par exemple, nous pouvons créer un lien vers un fichier statique à partir de notre modèle HTML:

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

Si vous souhaitez utiliser un filtre personnalisé, vous devrez mettre à jour la propriété env de Jinja2Templates:

de commonmark import commonmark
de starlette.templating import Jinja2Templates

def marked_filter(text):
    Retour à commonmark(texte)

templates = Jinja2Templates(directory ="templates")
templates.env.filters [`marked`] = marked_filter

Utiliser une instance jinja2.Environment personnalisée

Starlette accepte également une instance préconfigurée de jinja2.Environment.

Import jinja2
de starlette.templating import Jinja2Templates

env = jinja2.Environnement (...)
templates = Jinja2Templates(env=env)

Processeur de contexte

Un processeur de contexte est une fonction qui renvoie un dictionnaire à incorporer dans le contexte du modèle. chaque fonction ne prend qu 'un seul argument request et doit renvoyer un dictionnaire à ajouter au contexte.

Un cas d'utilisation courant pour les processeurs de modèles consiste à étendre le contexte du modèle avec des variables partagées.

Type d'import
de starlette.requests Demande d'importation

def app_context(request: Request) -> typing.Dict[str, typing.Any]:
    Retour sur {'app': request.app}

Enregistrement des templates contextuels

Le paramètre context_processors qui passe le processeur de contexte à la classe Jinja2Templates.

Type d'import

de starlette.requests Demande d'importation
de starlette.templating import Jinja2Templates

def app_context(request: Request) -> typing.Dict[str, typing.Any]:
    Retour sur {'app': request.app}

templates = Jinja2Templates(
    directory ='templates', context_processors=[app_context]
)

!!! L'information n'est pas prise en charge en tant que fonction asynchrone du processeur de contexte.

Test Template réponse

Lorsque vous utilisez un client de test, la réponse du modèle inclut les propriétés .template et .context.

depuis starlette.testclient import TestClient


def test_homepage():
    client = TestClient(app)
    réponse = client.get("/")
    assert response.status_code == 200
    assert response.template.name =="index.html"
    assert "request" en réponse à.context

Personnalisation de l'environnement Jinja2

Jinja2Templates accepte toutes les options prises en charge par Jinja2 Environment. cela permettra plus de contrôle sur les instances de Environment créées par Starlette.

Pour une liste des options disponibles pour Environment, vous pouvez consulter la documentation de Jinja2 ici.

de starlette.templating import Jinja2Templates


templates = Jinja2Templates(directory ="templates", autoescape=False, auto_reload=True)

Rendu asynchrone de template

Jinja2 prend en charge le rendu asynchrone des modèles, mais en général, nous vous recommandons d'éviter que vos modèles contiennent une logique qui appelle des recherches de base de données ou d'autres opérations d'E/S.

Au lieu de cela, nous vous recommandons de vous assurer que vos points de terminaison effectuent toutes les E/S, par exemple, en évaluant rigoureusement toute requête de base de données dans la vue et en incluant le résultat final dans son contexte.