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 dejinja2.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.