Я пытаюсь использовать PackageLoader jinja2, но не могу заставить его работать.
В моем app.yaml
у меня объявлены необходимые библиотеки:
libraries:
- name: jinja2
version: latest
- name: setuptools
version: latest
Самый маленький пример, который я мог создать:
import webapp2, sys
from jinja2 import Environment, PackageLoader
sys.path += ['lib/somepackage']
class Test(webapp2.RequestHandler):
def get(self):
env = Environment(loader=PackageLoader('common'))
self.response.write(env.get_template('test.html').render())
routes = [(r"/", Test)]
app = webapp2.WSGIApplication(routes, debug=True)
Пакет common
существует в каталоге lib/somepackage
и имеет пакет templates
, содержащий файл test.html
. HTML-файл содержит только текст «тест».
Когда создается PackageLoader
, provider
всегда равно NullProvider
в Google App Engine. Когда я вручную запрашиваю поставщика, я получаю DefaultProvider
, поэтому, очевидно, что-то здесь не так.
Чтобы запросить провайдера, я убеждаюсь, что lib/somepackage
находится в sys.path
, перейдя в этот каталог, затем:
>>> import pkg_resources
>>> provider = pkg_resources.get_provider('common')
>>> provider
<pkg_resources.DefaultProvider instance at 0x8490b2c>
Когда это не удается в Google App Engine, это соответствующая часть трассировки:
File "/<>/test/main.py", line 7, in get
self.response.write(env.get_template('test.html').render())
File "/<>/google_appengine/lib/jinja2-2.6/jinja2/environment.py", line 719, in get_template
return self._load_template(name, self.make_globals(globals))
File "/<>/google_appengine/lib/jinja2-2.6/jinja2/environment.py", line 693, in _load_template
template = self.loader.load(self, name, globals)
File "/<>/google_appengine/lib/jinja2-2.6/jinja2/loaders.py", line 115, in load
source, filename, uptodate = self.get_source(environment, name)
File "/<>/google_appengine/lib/jinja2-2.6/jinja2/loaders.py", line 226, in get_source
if not self.provider.has_resource(p):
File "/<>/google_appengine/lib/setuptools-0.6c11/pkg_resources.py", line 1170, in has_resource
return self._has(self._fn(self.module_path, resource_name))
File "/<>/google_appengine/lib/setuptools-0.6c11/pkg_resources.py", line 1218, in _has
"Can't perform this operation for unregistered loader type"
NotImplementedError: Can't perform this operation for unregistered loader type
Когда я использую вместо этого FileSystemLoader
, это работает, однако, я думаю, это не сработает в почтовом индексе:
import common.templates
env = Environment(loader=FileSystemLoader(common.templates.__path__))
Я видел этот вопрос SO, но это не проблема.
Обновление:
Я только что протестировал пример в SDK 1.7.6, и он работает, однако мне бы хотелось, чтобы он работал на более старом SDK (или на сервере old_dev_appserver).
__init__.py
вcommon
и вcommon.templates
. ;-) 03.04.2013