2009-12-01 16 views
11

में मैं मैको टेम्पलेट के साथ Pylons का उपयोग कर रहा हूँ और मैं यह सब समय टाइपिंग से बचना चाहते हैं:मार्क स्ट्रिंग के रूप में सुरक्षित मैको

${ h.some_function_that_outputs_html() | n } 

मैं चाहता हूँ समारोह को चिह्नित किसी भी तरह के लिए, या एक चर के रूप में सुरक्षित (आप Django में ऐसा कर सकते हैं) तो मुझे हर समय पाइप-एन नहीं करना है। कोई विचार?

उत्तर

10

मुझे अभी पता चला है कि अगर आप एचटीएमएल विधि डालते हैं आपकी कक्षा, तो माको उस विधि को कॉल करेगा और जो कुछ भी टेम्पलेट में लौटाएगा उसे आउटपुट करेगा।

तो मैंने किया:

def __html__(self): 
    return unicode(self) 

कि h.literal मूल रूप से क्या करता है।

+0

इसे "कक्षा" में जाना है जिसे 'h.some_function_that_outputs_html()' द्वारा माना जाता है। – Felix

3

mako docs about filtering के अनुसार, आप डिफ़ॉल्ट फिल्टर जब एक नया Template के साथ-साथ बनाने TemplateLookup के लिए (इस स्थिति में यह सब टेम्पलेट्स कि यह लग रहा है के लिए डिफ़ॉल्ट रूप से लागू होता है) कि टेम्पलेट्स के अंदर लागू होते हैं सेट कर सकते हैं default_filters तर्क के साथ।

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

यह वह जगह है तुम क्यों डिफ़ॉल्ट रूप से बचने के लिए (जो मामला नहीं है जब आप खुद ही मैको का उपयोग करें:

Pylons config/environment.py फाइल के अंदर अपनी परियोजना के लिए डिफ़ॉल्ट सेट करने TemplateLookup के साथ इस तर्क का उपयोग करता है)। तो आप या तो कॉन्फ़िगरेशन फ़ाइल में इसे वैश्विक रूप से बदल सकते हैं, या मानक लुकअप पर भरोसा नहीं कर सकते हैं। सावधान रहें कि आपको निश्चित रूप से उन चीजों से बचने के लिए स्पष्ट रूप से फ़िल्टर का उपयोग करना चाहिए, जो भागने की आवश्यकता है।

तुम भी एक स्ट्रिंग Pylons सहायक h.literal के साथ "के रूप में सुरक्षित के रूप में चिह्नित" पारित कर सकते हैं, उदाहरण के लिए यदि आप h.literal('This will <b>not</b> be escaped') टेम्पलेट को मिलेगा, इसलिये spam नामक एक चर के रूप में कहते हैं, आप बस किसी भी एस्केपिंग बिना ${spam} इस्तेमाल कर सकते हैं।

यदि आप एक टेम्पलेट के अंदर से एक निश्चित फ़ंक्शन को कॉल करते समय एक ही प्रभाव चाहते हैं, तो इस फ़ंक्शन को ऐसे शाब्दिक को वापस करने की आवश्यकता होगी, या उस फ़ंक्शन के लिए एक सहायक प्रदान करना होगा जो परिणाम पर h.literal पर कॉल करता है यदि आप छोड़ना चाहते हैं अकेले मूल कार्य। (या मुझे लगता है कि आप इसे "फ़िल्टरिंग डीफ़" के माध्यम से भी कॉल कर सकते हैं (उपरोक्त के समान मको दस्तावेज़ देखें), अभी तक इसका प्रयोग नहीं किया है)

+0

धन्यवाद, यह मेरे लिए काम करता है – disc0dancer

+0

पहले समाधान (डिफ़ॉल्ट_फिल्टर से बचने के लिए) का उपयोग करने वाले लोगों के लिए बस एक नोटिस - आपको इसे देखने के लिए कैश (आरएम-आर डेटा/टेम्पलेट्स/*) साफ़ करना होगा (मैंने अभी कुछ खर्च किया है क्या गलत है सोच रहा है)। – zefciu