2

我有以下项目,

APP
|-static
  |-templates
    |-file.html
|-blueprints
  |-blueprint1.py
  |-blueprint2.py
|-app.py

每个蓝图文件都有各种sanic路由,我想在调用时呈现模板。

我尝试将以下内容放入每个blueprint文件中,

template_env = Environment(
    loader=PackageLoader('APP', 'static/templates'),
    autoescape=select_autoescape(['html', 'xml'])
)

只是为了得到错误ModuleNotFoundError: No module named 'APP'

替换APPblueprints我错误TypeError: expected str, bytes or os.PathLike object, not NoneType

我也尝试过使用FileSystemLoader这样的,

template_loader = FileSystemLoader(searchpath="../static/templates")
template_env = Environment(loader=template_loader)

并加载我需要的模板template = template_env.get_template('file.html')

但是我template not found在访问网址时得到了一个。

直接尝试渲染我的模板,

with open('..static/templates/file.html') as file:
    template = Template(file.read())

再次导致file not found错误。

jinja在我的应用程序中使用模板的最佳方式是什么?

4

2 回答 2

4

在此,我在女巫中创建了一个项目,我为 jinja 模板渲染了一个值,它工作正常,您可以看看这个,希望对您有所帮助:这是项目的树:

.
├── app.py
└── static
    └── templates
        └── template.html

2 directories, 2 files

这是template.html:

<html>
<header><title>This is title</title></header>
<body>
  <p>{{ value }}!</p>
</body>
</html>

这是 app.py :

#!/usr/bin/python
import jinja2
import os
path=os.path.join(os.path.dirname(__file__),'./static/templates')
templateLoader = jinja2.FileSystemLoader(searchpath=path)
templateEnv = jinja2.Environment(loader=templateLoader)
TEMPLATE_FILE = "template.html"
hello="hello..... "
template = templateEnv.get_template(TEMPLATE_FILE)
outputText = template.render(value=hello)  # this is where to put args to the template renderer
print(outputText)

输出:

<html>
<header><title>This is title</title></header>
<body>
</body>
</html>
@gh-laptop:~/jinja$ python app.py 
<html>
<header><title>This is title</title></header>
<body>
  <p>hello..... !</p>
</body>
</html>
于 2019-06-23T19:08:06.243 回答
0

简单解释一下如何PackageLoader工作:定义的模板文件夹(第二个参数:package_path)应该相对于包含从 python 可见的模块的文件夹(第一个参数:package_name)。

所以APP不是一个模块,你应该使用它app。由于模板文件夹将相对于APP(包含 的文件夹app),package_path所以很好。

于 2020-02-13T10:44:44.757 回答