Ir para o conteúdo

Templates

O Lilya não está intrinsecamente ligado a nenhum mecanismo de modelagem específico, mas o Jinja2 destaca'se como uma excelente escolha devido às suas origens comprovadas e ampla adoção no mundo Python.

Jinja2Template

Isso é o que Lilya traz por defeito e permite servir HTML por meio dos handlers.

from lilya.templating import Jinja2Template

Parâmetros

  • directory: Uma string, os.Pathlike, ou uma lista de strings ou os.Pathlike indicando um caminho para uma directoria.
  • env: Qualquer instância diferente de jinja2.Environment (Opcional).
  • **options: Argumentos de palavra-chave adicionais para passar ao ambiente Jinja2.

Uso do Jinja2Template

O Lilya traz uma configuração pré-configurada do Jinja2Template que provavelmente será o que desejará usar. Caso queira um jinja2.Enviroment diferente, isso também pode ser passado ao instanciar o Jinja2Template.

from lilya.apps import Lilya
from lilya.requests import Request
from lilya.routing import Include, Path
from lilya.staticfiles import StaticFiles
from lilya.templating import Jinja2Template

templates = Jinja2Template(directory="templates")


async def homepage(request: Request):
    return templates.get_template_response(request, "index.html")


app = Lilya(
    debug=True,
    routes=[
        Path("/", homepage),
        Include("/static", StaticFiles(directory="static"), name="static"),
    ],
)

Parâmetros de resposta dos modelos

A função get_template_response espera os seguintes argumentos:

  • request: (obrigatório): O objecto de request HTTP.
  • name: (obrigatório): O nome da template a ser renderizada.

Quaisquer argumentos ou argumentos de palavra-chave adicionais fornecidos serão passados diretamente para a template como contexto. Isto permite incluir dados dinâmicos no processo de renderização da template. Pode passar esses argumentos como argumentos de palavra-chave ou argumentos posicionais, dependendo de sua preferência.

Warning

É imperativo incluir a instância de request recebida como parte do contexto da template.

O contexto da template Jinja2 incorpora automaticamente uma função url_for, permitindo a criação correta de links para outras páginas dentro da aplicação.

Por exemplo, ficheiros estáticos podem ser vinculados a partir de templates HTML:

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

Caso deseje utilizar filtros personalizados, será necessário atualizar a propriedade env do Jinja2Template:

from lilya.templating import Jinja2Template


def marked_filter(text): ...


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

O jinja2.Environment

Lilya aceita uma instância preconfigurada de jinja2.Environment passando-a dentro do atributo env ao instanciar o Jinja2Template.

import jinja2

from lilya.templating import Jinja2Template

env = jinja2.Environment(...)
templates = Jinja2Template(env=env)

Processadores de Contexto

Um processador de contexto é uma função que retorna um dicionário a ser incorporado num contexto da template. Cada função recebe apenas um argumento, request, e deve retornar um dicionário a ser adicionado ao contexto.

Um caso de uso típico para processadores da template é aprimorar o contexto da template com variáveis compartilhadas.

from lilya.requests import Request


def application_context(request: Request):
    return {"app": request.app}

Registrando Processadores de Contexto

Para registrar processadores de contexto, passe-os para o argumento context_processors da classe Jinja2Template.

from lilya.requests import Request
from lilya.templating import Jinja2Template


def settings_context(request: Request):
    return {"settings": request.app.settings}


templates = Jinja2Template(
    directory="templates",
    context_processors=[settings_context],
)

Ambiente Jinja2 Personalizado

Jinja2Template aceita todas as opções suportadas pelo Environment do Jinja2. Isto concede um maior controlo sobre a instância de Environment criada pelo Lilya.

Para a lista de opções disponíveis para Environment, consulte a documentação do Jinja2 aqui.

from lilya.templating import Jinja2Template

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

Renderização da Template Assíncrona

Embora o Jinja2 suporte a renderização assíncrona de templates, é aconselhável evitar a inclusão de lógica em templates que acionem consultas de base de dados ou outras operações de I/O.

Uma prática recomendada é garantir que os endpoints lidem com todas as operações de I/O. Por exemplo, execute consultas de base de dados dentro da view e inclua os resultados finais no contexto. Esta abordagem ajuda a manter as templates focados na lógica de apresentação, em vez de operações de I/O.