2012-03-19 8 views
16

मैं include टैग का उपयोग करके Jinja 2.6 का उपयोग कर एक पृष्ठ में फ़ाइल डालने का प्रयास कर रहा हूं। यह ठीक काम करता है जब तक कि मैंने उस फ़ाइल में वर्णों का उपयोग शुरू नहीं किया जो कि जिन्जा सिंटैक्स की याद दिलाता है, जिस बिंदु पर यह महसूस किया कि यह उन्हें पार्स नहीं कर सकता और बमबारी नहीं कर सका।वास्तविक रूप से उन फ़ाइलों को पार्सिंग के बिना जिन्जा टेम्पलेट्स में स्थिर फ़ाइलों को सम्मिलित करें

फ़ाइल के बावजूद जाने और सभी पात्रों से बचने के लिए, मैं जिन्जा को फ़ाइल को शामिल करने के लिए क्या कह सकता हूं?

+1

स्पष्ट करने के लिए, बाहरी फ़ाइल जावास्क्रिप्ट टेम्पलेट्स कि में इस्तेमाल किया जा रहा मूँछ का एक सेट है कई जगहें मैं उन्हें संशोधित नहीं करना चाहता - बस उन्हें HTML स्रोत में शामिल करें। –

उत्तर

17

आप पाठ फ़ाइल लोड और टेम्प्लेट में प्रस्तुत करने के लिए एक समारोह को परिभाषित कर सकते सापेक्ष हो सकता है:

import jinja2 

def include_file(name): 
    return jinja2.Markup(loader.get_source(env, name)[0]) 

loader = jinja2.PackageLoader(__name__, 'templates') 
env = jinja2.Environment(loader=loader) 
env.globals['include_file'] = include_file 

def render(): 
    return env.get_template('page.html').render() 

if __name__ == '__main__': 
    print render() 

टेम्पलेट में, यह इस तरह कहते हैं:

{{ include_file('file.txt') }} 
+1

धन्यवाद ... मैं उम्मीद कर रहा था कि एक निर्मित विधि या प्लगइन था जिसे मैं याद करता था, लेकिन मैं बस इसके साथ जाऊंगा। –

+0

हाय, एलेक्स मुझे आपके कोड का उपयोग करते समय आउटपुट नहीं मिला क्योंकि कुछ पैरामीटर का उपयोग अपरिभाषित है। "(loader.get_source (env, name)" क्या आप विवरण में समझा सकते हैं। – cSharma

4

{% raw %} {% endraw %} में अन्य फ़ाइलों में वाक्य रचना डालने की कोशिश करो

आप jQuery का उपयोग कर सकते है अगर आप न बाह्य फ़ाइलों को संपादित करना चाहते हैं: एक डुबकी बनाने सामग्री <div id="contentoffile"></div>

और उपयोग को रोकने के लिए jQuery लोड करने के लिए फ़ाइल: $("#contentoffile").load("url to file") < < यूआरएल

+0

यह काम करता है, लेकिन मुद्दा यह है कि मैं शामिल फ़ाइलों को संशोधित नहीं करना चाहता हूं। वे बाहरी हैं और अन्य स्थानों में उपयोग किए जा रहे हैं। –

+1

AJAX टिप के लिए धन्यवाद ... हालांकि, मैं अतिरिक्त अनुरोध से बचने की कोशिश कर रहा हूं। टेम्पलेट को प्रस्तुत किए जाने पर फ़ाइलों को सही होने पर मुझे एक और राउंडट्रिप क्यों करने की आवश्यकता नहीं है। –

9

आप बोतल इसे इस तरह से लिखा जा सकता है उपयोग कर रहे हैं:

from jinja2 import Markup 

... 

app.jinja_env.globals['include_raw'] = lambda filename : Markup(app.jinja_loader.get_source(app.jinja_env, filename)[0]) 

और उपयोग किया गया इस तरह:

{{ include_raw('js-inline/modernizr.min.js') }} 

शामिल फ़ाइल का पथ सामान्य रूप से आपके टेम्पलेट फ़ोल्डर के सापेक्ष है।

1

@ एलेक्स के उत्तर के अपडेट के रूप में, आप वैश्विक चर पर निर्भरता को हटाने के लिए जिनजा के @contextfunction सजावटी का उपयोग कर सकते हैं।

import jinja2                                                 

@jinja.contextfunction                                               
def include_file(ctx, name):                                             
    env = ctx.environment                                              
    return jinja2.Markup(env.loader.get_source(env, name)[0])                                     


def main():                                                  
    loader = jinja2.PackageLoader(__name__, 'templates')                                      
    env = jinja2.Environment(loader=loader)                                          
    env.globals['include_file'] = include_file                                         

    env.get_template('page.html').render()                                          


if __name__ == '__main__':                                              
    print main() 

और बस के रूप में पहले, यह आपकी टेम्प्लेट से कॉल की तरह: अद्यतन कोड कैसा दिखेगा

{{ include_file('file.txt') }} 
+0

लेकिन आप विधि से 'ctx' पैरामीटर नहीं पारित कर रहे हैं?!? – cSharma

+0

'@ contextfunction' सजावटी इसे आपूर्ति करता है। [डॉक्स] (http: //jinja.pocoo.org/docs/dev/api/#jinja2.contextfunction) – lsowen

+0

जब मैं फ़ंक्शन को कॉल कर रहा हूं तो यह एक त्रुटि को फेंकने के रूप में एक और पैरामीटर आवश्यक है ... – cSharma

संबंधित मुद्दे