从 egg 包中加载模板

flask load templates from an egg package

我正在创建一个模块化的 Flask 应用程序,它从 egg 文件加载蓝图,但这些蓝图需要从这些包中渲染模板。

我的项目是这样的:

some folders/
templates/ #the base folders
static/
blueprints/
  |- blueprint1.egg
  |  |- templates/ #inside the .egg
  |  |- some other folders/
  |  |- main.py
  |- blueprint2.egg
     |- templates/
     |- some other folders/
     |- main.py
my_flask_main.py

现在我可以从那些 .egg 中导入和注册正确的蓝图,但是我如何从 .egg 中加载这些模板并即时提取它们,或者更好地直接从 .egg 中读取它们?

(当蓝图未打包时在开发模式下很明显,它有效,我需要一种方法在蓝图打包时加载它们)

提前致谢。

经过一些研究和测试,几天后我终于找到了一种方法:

bp_dummy = Blueprint('dummy', __name__, template_folder='templates')

bp_dummy.jinja_loader = jinja2.ChoiceLoader([
    bp_dummy.jinja_loader,
    jinja2.PackageLoader(__name__) # in the same folder will search the 'templates' folder
])

首先,在每个蓝图实例中你必须定义模板文件夹路径,并覆盖默认的jinja2模板文件夹(默认应该是一个FileSystemLoader),所以模块打包时,默认加载器会失败,并且PackageLoader 有效。