Question

J'utilise Pylons avec des modèles Mako et je veux éviter de taper ceci tout le temps:

${ h.some_function_that_outputs_html() | n }

Je veux en quelque sorte marquer la fonction, ou une variable, comme étant sûre (vous pouvez le faire dans Django) afin que je n’aie pas à faire de pipe tout le temps. Des idées?

Était-ce utile?

La solution

Je viens de découvrir que si vous mettez une méthode html dans votre classe, Mako appellera alors cette méthode et affichera ce qu'elle renvoie dans le modèle.

Alors j'ai fait:

def __html__(self):
    return unicode(self)

C’est essentiellement ce que fait h.literal.

Autres conseils

Selon les docs mako sur le filtrage , vous pouvez définir les filtres par défaut sont appliqués à l'intérieur des modèles lors de la création d'un nouveau Template ainsi que pour le TemplateLookup (auquel cas cela s'appliquerait par défaut pour tous les modèles consultés), avec l'argument default_filters.

Pylons utilise cet argument avec config/environment.py pour définir les valeurs par défaut de votre projet dans le fichier h.literal:

# 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'])

C'est pourquoi vous obtenez l'échappement par défaut (ce qui n'est pas le cas lorsque vous utilisez Mako par vous-même). Vous pouvez donc le modifier globalement dans le fichier de configuration ou ne pas vous fier à la recherche standard. Attention, vous devez bien sûr utiliser explicitement un filtre pour échapper aux éléments qui en ont besoin.

Vous pouvez également passer une chaîne & "; marquée comme étant sûre" & "; avec l'aide de Pylons h.literal('This will <b>not</b> be escaped'), par exemple, si vous voulez passer spam au modèle, en tant que variable nommée ${spam}, vous pouvez simplement utiliser <=> sans échappement.

Si vous souhaitez le même effet lorsque vous appelez une certaine fonction depuis un modèle, cette fonction devra renvoyer un tel littéral ou fournir un assistant pour cette fonction qui appelle <=> le résultat si vous souhaitez quitter. la fonction d'origine seule. (ou je suppose que vous pouvez également l'appeler via un & "Filtre filtrant &"; (voir le même document Mako que ci-dessus), vous n'avez pas encore expérimenté cela.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top