【问题标题】:HTML templating using Jinja2 - Lost使用 Jinja2 的 HTML 模板 - 丢失
【发布时间】:2012-12-25 22:57:16
【问题描述】:

我正在尝试使用 Jinja2 在 python 中创建一个 html 模板。我有一个包含“template.html”的模板文件夹,但我不知道如何处理环境或包加载器。

我使用 easy_python 安装了 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

【问题讨论】:

    标签: python html templates jinja2


    【解决方案1】:

    如果您不想要或不需要 Python 包,您可能应该改用 FileSystemLoader,如下所示:

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

    【讨论】:

      【解决方案2】:

      PackageLoader 需要一个使用常规点语法的实际 Python 模块。例如,如果您的结构如下所示:

      myapp/
        __init__.py
        …
        templates/
          mytemplate.html
      

      您应该使用myapp 作为模块名称。

      【讨论】:

        【解决方案3】:

        我使用以下代码解决了这个问题:

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

        此代码在文件scriptname.py 中的位置。

        我不确定我的答案是否相关,但我想知道也许有人会觉得这个答案有用。如果我错了,请告诉我。

        【讨论】:

        • 包加载器调用scriptname.py。如果你在那里初始化包加载器,代码将被第二次调用。
        • 你要小心——如果你的代码不是全部在函数/类中,重新导入同一个文件会重新执行里面的代码,导致双模板输出!
        【解决方案4】:

        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.
            """
        

        然后__init__()方法如下:

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

        这让我们注意到这样的结构:

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

        这两个声明将具有相同的PackageLoader 实例:

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

        因此,如果您从 myapp/ 路径运行,那么您只需说:

        PackageLoader('templates', '')
        

        所以它只会以templates/ 作为路径。如果您将第二个参数留空,它将尝试在templates/templates 中查找模板。

        最后,您可以使用list_templates() 方法检查已加载的内容:

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

        【讨论】:

          猜你喜欢
          • 2016-03-22
          • 2011-03-13
          • 1970-01-01
          • 1970-01-01
          • 2011-06-15
          • 1970-01-01
          相关资源
          最近更新 更多