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.