2009-12-01 23 views
11

I Mako şablonları ile pilonlarda kullanarak ve ben bu hep yazarak kaçınmak istiyorum: (işaretle dize kadar güvenli Mako

${ h.some_function_that_outputs_html() | n } 
istediğim

fonksiyonunu işaretlemek şekilde yapmak ya da bir değişken olarak güvende Bunu Django'da yapabilirim) bu yüzden her zaman boru-en zorunda kalmam. Herhangi bir fikir?

cevap

10

Sadece html yöntemini koyarsanız sınıfınız, daha sonra Mako, bu yöntemi ve çıktıyı şablonda ne getiriyorsa çağırır.

Ve yaptım:

def __html__(self): 
    return unicode(self) 

h.literal yapar temelde ne bu.

+0

Bu, "h.some_function_that_outputs_html()" tarafından döndürülen "sınıfa" girmelidir. – Felix

3

mako docs about filtering göre, (ki bu durumda bu yukarıyı tüm şablonları için varsayılan olarak geçerli olacak) TemplateLookup yanı sıra yeni Template oluştururken şablonları içine uygulanan varsayılan filtreleri ayarlayabilirsiniz default_filters bağımsız değişkeni ile. Eğer durum böyle değildir ki (varsayılan olarak kaçan olsun neden tek başına Mako kullandığınızda

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

budur:

Pylons config/environment.py dosya içindeki projeniz için varsayılan ayarlamak için TemplateLookup ile bu tartışmayı kullanır). Yani, ya global olarak config dosyasında değiştirebilir ya da standart aramaya güvenemezdiniz. Tabii ki, kaçınmanız gereken şeylerden kurtulmak için açıkça bir filtre kullanmanız gerektiğine dikkat edin.

Ayrıca Pylons yardımcı h.literal ile "güvenli olarak işaretlenmiş" bir dize iletebilirsiniz örneğin size şablona h.literal('This will <b>not</b> be escaped') geçerdi eğer spam adında bir değişken olarak söylemek, sadece herhangi kaçması olmadan ${spam} kullanabilirsiniz.

Eğer bir şablon içinden belli işlevi çağırmak aynı etkiyi isterseniz bırakmak istiyorsanız, bu işlev böyle bir hazır dönmek veya sonuca h.literal çağırır işlev için bir yardımcı sağlamak gerekir yalnız orijinal işlev. (ya da bir "Filtering def" ile de görebiliyorsunuz) (yukarıdakiyle aynı Mako belgesine bakınız), henüz deneyimlemediniz)

+0

sayesinde bu (default_filters kaçıp kaldırma) ilk çözüm kullanarak insanlar için bana – disc0dancer

+0

Sadece bir uyarı çalıştı - Eğer (rm -r veri/templates/*) bu çalışma görmek için önbelleği temizlemek zorunda (Ben sadece harcanan bazı neyin yanlış olduğunu merak ediyorum). – zefciu

İlgili konular