2013-01-11 40 views
7

मैं Jinja2 का उपयोग कर अजगर में एक HTML टेम्पलेट बनाने की कोशिश कर रहा हूं। मेरे पास 'टेम्पलेट.html' के साथ एक टेम्पलेट फ़ोल्डर है लेकिन मुझे नहीं पता कि वातावरण या पैकेज लोडर से कैसे निपटें।जेनजा 2 का उपयोग करके एचटीएमएल टेम्पलेटिंग - खोया

मैंने easyjapython का उपयोग करके Jinja2 स्थापित किया और निम्न स्क्रिप्ट चलाया।

from jinja2 import Environment, PackageLoader 
env = Environment(loader=PackageLoader('yourapplication', 'templates')) 
template = env.get_template('mytemplate.html') 
print template.render() 

मुझे निम्न त्रुटि मिलती है क्योंकि मुझे नहीं पता कि पैकेज/मॉड्यूल को कैसे परिभाषित किया जाए। कृपया मेरी मदद करें मैं बस एक साधारण टेम्पलेट बनाना चाहता हूं।

File "log_manipulationLL.py", line 291, in <module> 
env = Environment(loader=PackageLoader('yourapplication', 'templates')) 
File "/usr/local/lib/python2.7/dist-packages/Jinja2-2.6-py2.7.egg/jinja2/loaders.py", line 216, in __init__ 
provider = get_provider(package_name) 
File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 213, in get_provider 
__import__(moduleOrReq) 
ImportError: No module named yourapplication 

उत्तर

8

PackageLoader नियमित डॉट सिंटैक्स का उपयोग एक वास्तविक पायथन मॉड्यूल की उम्मीद है। उदाहरण के लिए अपने संरचना इस तरह दिखता है:

myapp/ 
    __init__.py 
    … 
    templates/ 
    mytemplate.html 

आपने मॉड्यूल नाम के रूप में myapp उपयोग करना चाहिए।

env = Environment(loader=PackageLoader('scriptname', 
             templatesPath)) 

जहां इस कोड को फ़ाइल scriptname.py में है:

+0

आप इसे खाली छोड़ सकते हैं। Http://docs.python.org/2/tutorial/modules.html#packages – patrys

+0

देखें बहुत बहुत धन्यवाद! – pombo

8

मैं निम्नलिखित कोड का उपयोग कर इस समस्या का समाधान।

मुझे यकीन नहीं है कि मेरा उत्तर प्रासंगिक है लेकिन मैं सोच रहा था कि शायद कोई यह जवाब उपयोगी हो सकता है। अगर मैं गलत हूं तो कृपया मुझे बताएं।

+1

पैकेज लोडर 'scriptname.py' कहता है। यदि आप पैकेज लोडर को वहां प्रारंभ करते हैं, तो कोड दूसरी बार कॉल किया जाएगा। – Henrik

8

आप नहीं चाहते या एक अजगर पैकेज की जरूरत है, तो आप शायद एक FileSystemLoader बजाय इस तरह का प्रयोग करना चाहिए,:

from jinja2 import Environment, FileSystemLoader, select_autoescape 
env = Environment(
    loader=FileSystemLoader('file/path/'), 
    autoescape=select_autoescape(['html', 'xml']), 
) 
1

PackageLoader इस तरह परिभाषित किया गया है:

class PackageLoader(BaseLoader): 
    """Load templates from python eggs or packages. It is constructed with 
    the name of the python package and the path to the templates in that 
    package:: 

     loader = PackageLoader('mypackage', 'views') 

    If the package path is not given, ``'templates'`` is assumed. 

    Per default the template encoding is ``'utf-8'`` which can be changed 
    by setting the `encoding` parameter to something else. Due to the nature 
    of eggs it's only possible to reload templates if the package was loaded 
    from the file system and not a zip file. 
    """ 

और फिर

def __init__(self, package_name, package_path='templates', 
      encoding='utf-8'): 

यह हमें है कि एक सेंट नोटिस बनाता है: __init__() विधि इस प्रकार है इस तरह ructure:

PackageLoader('myapp') 
PackageLoader('myapp', 'templates') 

और इसलिए यदि आप myapp/ पथ से चल रहे हैं, तो आप सिर्फ इतना कहना है की जरूरत है::

myapp/ 
    __init__.py 
    ... 
    templates/ 
    mytemplate.html 

इन घोषणाओं के दोनों के साथ एक ही PackageLoader उदाहरण होगा

PackageLoader('templates', '') 

ताकि यह पथ के रूप में templates/ ले जाएगा। यदि आप दूसरा तर्क खाली छोड़ देते हैं, तो यह templates/templates में टेम्पलेट्स को खोजने का प्रयास करेगा।

अंत में, आप जाँच कर सकते हैं क्या list_templates() विधि का उपयोग कर लोड किया गया है:

PackageLoader('templates', '').list_templates()