【问题标题】:need to package jinja2 template for python需要为python打包jinja2模板
【发布时间】:2016-12-01 18:08:18
【问题描述】:

(更新:我用更好的答案提出了一个更好的问题here。我打算删除这个问题,但其中一些答案可能对未来的搜索者有用。)

我的问题与this 几乎相同,但该答案很丑陋(需要包含sharedtemplates/templates/templates/ 的目录结构),发布时不完整(用户“回答”了他自己的问题),并假设我不知道一些知识没有。

我正在开发我的第一个 python 支持的 Web 应用程序。 javascript 组件正在使用静态 HTML 页面进行开发。现在我想要一个服务器端 python 组件来处理 AJAX 调用并使用 jinja2 呈现 HTML 模板。

我之前在 python 上取得过成功,使用 tkinter/requests 创建 GUI 应用程序。喜欢这种语言,但 python 环境(环境?)令人困惑。我不在virtualenv 工作。

根据jinja2 docs,HTML 模板必须在一个叫做包的东西中。然后你创建一个Environment 和一个知道包名和模板目录的PackageLoader

from jinja2 import Environment, PackageLoader
env = Environment(loader=PackageLoader('yourapplication', 'templates'))

所以,这是我的 index.py(它只是一个存根,甚至不会尝试渲染任何内容,但您至少可以判断它是否崩溃)。

#!/usr/bin/python
from jinja2 import Environment, PackageLoader # no prob, jinja2 correctly installed using pip

env = Environment(loader=PackageLoader('mypkg', 'template')) # causes server error

# if it doesn't crash, just put up a basic html page for now
print ("Content-type: text/html\r\n\r\n")
print("<html><head><title>hello</title></head><body>hello wuld</body></html>")

目录结构如下:

index.py
mypkg/
mypkg/template/index.html
mypkg/__init__.py  # empty

错误日志中的相关行:

ImportError: No module named mypkg

也许我需要以不同的方式构建它,而且我很确定我需要创建并调用 setup.py 来安装模块。这是其他答案遗漏的部分内容:setup.py 中有什么内容,在这种情况下它是如何工作的?我查看了setup.py 上的数十个资源,但似乎没有一个与安装 HTML 模板的问题有关。

提前感谢您的帮助!

更新:fragilewindows 指向一个讲述“开发者模式”的资源,这可能是答案的一部分。这里的困难是,我希望将此模板打包用于本地部署,而不是用于分发。但是 99% 的在线文档都是关于 PyPi 打包项目的。我不需要打包“项目”,只需一个极小的 HTML 模板。事实上,我需要打包模板的唯一原因是因为这是jinja2 访问模板的默认方式(我确实想在 python 中使用本机)。

我只需要让环境相信“mypkg”已安装,并且“模板”是安装中的一个目录。你可以看到我迄今为止的努力是幼稚的;我希望正确的答案会相应地轻量级。

【问题讨论】:

    标签: python templates module jinja2 setup.py


    【解决方案1】:

    也许 PYTHONPATH 有问题。根据 Python 文档https://docs.python.org/2.7/tutorial/modules.html#the-module-search-path 它在以下位置搜索模块:

    • 包含输入脚本的目录(或当前目录)。
    • PYTHONPATH(目录名称列表,与 shell 变量 PATH 语法相同)。
    • 依赖于安装的默认值。

    您可以向您的应用程序添加一些代码 - 打印 sys.path 变量以确保您的应用程序的路径也存在。

    import sys
    from jinja2 import Environment, PackageLoader # no prob, jinja2 correctly installed using pip
    print sys.path # printing your sys.path
    env = Environment(loader=PackageLoader('mypkg', 'template')) # causes server error
    

    如果不是你可以添加

    sys.path.append(path_to_your_application) 
    

    【讨论】:

      【解决方案2】:

      我发现了一个解决方法,here。在这种用法中,模板不是模块或包的一部分;它直接从文件系统加载。文件系统:

      ./index.py
      ./template.html
      

      index.py:

      #!/usr/bin/python
      import jinja2
      
      templateLoader = jinja2.FileSystemLoader( searchpath="." )
      templateEnv = jinja2.Environment( loader=templateLoader )
      TEMPLATE_FILE = "template.html"
      template = templateEnv.get_template( TEMPLATE_FILE )
      outputText = template.render( ) # this is where to put args to the template renderer
      
      print ("Content-type: text/html\r\n\r\n")
      print(outputText)
      

      【讨论】:

        【解决方案3】:

        我不知道打包涉及的过程,但我认为由于 Jinja2 是用 Python 编写的,因此该过程与用 Python 打包任何其他应用程序相同。

        以下是一些可能对您有用的链接:

        我希望这会有所帮助。

        【讨论】:

        • 谢谢,PPUG 确实有一个有用的见解(开发模式)。但是那些其他资源与我的问题无关。我正在开发此应用程序用于内部部署,而不是用于分发。 python 打包搜索结果的前七页主要针对代码的分发,这不是我的问题。我会相应地更新我的问题。
        猜你喜欢
        • 1970-01-01
        • 2014-02-11
        • 2015-01-06
        • 2021-11-26
        • 2020-11-21
        • 1970-01-01
        • 2022-01-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多