2016-07-27 91 views
0

(更新:我做了一个更好的答案here我要删除这个问题的一个更好的问题,但一些问题的答案可能有好处,未来的搜索。)需要打包的Jinja2模板蟒蛇

我的问题与this大致相同,但答案很难看(需要一个包括sharedtemplates/templates/templates/的目录结构),发布时不完整(用户“回答”他自己的问题),并假设我没有的知识。

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

我以前用python成功了,用tkinter/requests创建GUI应用程序。爱语言,但python环境(环境?)令人困惑。我不是在virtualenv工作。

根据jinja2 docs,HTML模板必须被称为包。然后创建一个PackageLoader,知道包的名称和模板目录的Environment

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”是安装目录中的一个目录。你可以看到我迄今的努力是天真的;我期望正确的答案将相应地轻量级。

回答

1

我不知道与包装有关的过程,但是我认为Jinja2是用Python编写的,这个过程与在Python中打包任何其他应用程序的过程相同。

这里有几个链接,可能对你有用:

我希望这有助于。

+0

由于添加的PPUG确实有一个有益的启示(开发模式)。但那些其他资源与我的问题无关。我正在开发此应用程序进行内部部署,而不是分发。 python包装上的搜索结果前七页主要涉及代码的分发,这不是我的问题。我会相应地更新我的问题。 –

4

我发现了一个解决方法,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) 
0

也许一个问题是PYTHONPATH。

您可以添加一些代码到你的应用程序 - 打印sys.path的变量,以确保您的applcation的路径也有。

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)