需要打包python的jinja2模板

Jua*_*mas 1 python templates module jinja2 setup.py

(更新:我做了一个更好的答案一个更好的问题在这里我要删除这个问题,但一些问题的答案可能被证明未来的搜索有用。)

我的问题与基本相同,但是答案很丑陋(要求包含dir结构sharedtemplates/templates/templates/),发布时不完整(用户“回答”了他自己的问题),并假设我没有一些知识。

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

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

根据jinja2 docs的说法,HTML模板必须位于称为包的东西中。然后使用来创建一个EnvironmentPackageLoader该知道包的名称和模板目录:

from jinja2 import Environment, PackageLoader
env = Environment(loader=PackageLoader('yourapplication', 'templates'))
Run Code Online (Sandbox Code Playgroud)

因此,这是我的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>")
Run Code Online (Sandbox Code Playgroud)

这是目录结构:

index.py
mypkg/
mypkg/template/index.html
mypkg/__init__.py  # empty
Run Code Online (Sandbox Code Playgroud)

错误日志中的相关行:

ImportError: No module named mypkg
Run Code Online (Sandbox Code Playgroud)

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

在此先感谢您的帮助!

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

我只需要说服环境已安装“ mypkg”,并且“模板”是安装中的目录。您可以看到,到目前为止,我的努力还很幼稚。我希望正确的答案将相应地轻量级。

Jua*_*mas 5

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

./index.py
./template.html
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)