需要为Python打包jinja2模板

4

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

我的问题与this几乎相同,但那个答案很丑陋(需要包括sharedtemplates/templates/templates/在内的目录结构),作为发布的不完整(用户“回答”了自己的问题),并假定我没有的某些知识。

我正在开发我的第一个使用Python支持的Web应用程序。JavaScript组件已经使用静态HTML页面进行了很好的开发。现在我想要一个服务器端的Python组件来处理AJAX调用并使用jinja2渲染HTML模板。

我以前在Python中取得了成功,使用tkinter/requests创建GUI应用程序。喜欢这种语言,但是Python环境(环境?)令人困惑。我没有在virtualenv中工作。

根据jinja2文档,HTML模板必须在所谓的包中。然后,您可以使用PackageLoader创建一个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”已安装,并且“template”是安装中的目录。您可以看到,到目前为止我的尝试都很幼稚;我期望正确的答案会相应地轻量级。
3个回答

9
我已经发现了一种解决方法,在这里。在这种情况下,模板不是模块或包的一部分;它直接从文件系统中加载。文件系统:
./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)

1

我不知道打包涉及的过程,但我想既然Jinja2是用Python编写的,那么打包的过程应该与打包其他Python应用程序的过程相同。

这里有一些链接可能对您有用:

希望这能帮到您。


谢谢,PPUG确实提供了有用的见解(开发模式)。但是那些其他资源对我的问题来说相当无关紧要。我正在开发这个应用程序以供内部部署,而不是分发。在Python打包的前七页搜索结果中,重点是代码的分发,这并不是我的问题。我会相应地更新我的问题。 - Juan Tomas

0

可能问题出在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) 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接