Pergunta

Eu estou usando Pilões com modelos Mako e eu quero evitar digitar isso o tempo todo:

${ h.some_function_that_outputs_html() | n }

Eu quero marcar de alguma forma, a função, ou uma variável como seguro (você pode fazer isso no Django) para que eu não tenho que pipe-en todo o tempo. Alguma ideia?

Foi útil?

Solução

Eu só descobri que se você colocar um html método em sua classe, em seguida, Mako só vai chamar esse método e saída de qualquer que seja ele retorna no modelo.

Então eu fiz:

def __html__(self):
    return unicode(self)

Isso é basicamente o que h.literal faz.

Outras dicas

De acordo com a mako docs sobre como filtrar , você pode definir os filtros padrão que são aplicados dentro modelos ao criar um novo Template, bem como para o TemplateLookup (caso em que isso se aplicaria por padrão para todos os modelos que olha acima), com o argumento default_filters.

Pilões usa esse argumento com TemplateLookup para definir os padrões para o seu projeto dentro do arquivo config/environment.py:

# Create the Mako TemplateLookup, with the default auto-escaping
config['pylons.app_globals'].mako_lookup = TemplateLookup(
    directories=paths['templates'],
    error_handler=handle_mako_error,
    module_directory=os.path.join(app_conf['cache_dir'], 'templates'),
    input_encoding='utf-8', default_filters=['escape'],
    imports=['from webhelpers.html import escape'])

É por isso que você começa a escapar por padrão (que não é o caso quando você usa Mako por si mesmo). Então, você poderia mudá-lo globalmente no arquivo de configuração, ou não contar com a pesquisa padrão. Cuidado que você deve, naturalmente, em seguida, usar explicitamente um filtro para escapar essas coisas que precisam escapar.

Você também pode passar uma string "marcados como seguros" com a ajudante h.literal Pilares, por exemplo, se você passar h.literal('This will <b>not</b> be escaped') ao modelo, digamos, como uma variável chamada spam, você pode simplesmente usar ${spam} sem qualquer fuga.

Se você quiser o mesmo efeito quando você chamar uma determinada função de dentro de um modelo, essa função seria necessário para retornar uma tal literal, ou fornecer um ajudante para essa função que as chamadas h.literal no resultado, se você quiser deixar o original funcionar sozinho. (Ou eu acho que você também poderia chamá-lo através de um "Filtrando def" (ver mesmo doc Mako como acima), não têm experimentado com que até o momento)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top