4

jinja2 が提供する PackageLoader を使用しようとしていますが、動作させることができません。

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パッケージがあります。html ファイルには、テキスト「test」のみが含まれています。templatestest.html

PackageLoader構築されると、Google App Engine ではprovider常にwhen になります。NullProviderプロバイダーを手動でリクエストすると、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

代わりにa を使用するFileSystemLoaderと機能しますが、これは zip では機能しないと思います:

import common.templates
env = Environment(loader=FileSystemLoader(common.templates.__path__))

このSOの質問を見たことがありますが、これは問題ではありません。

アップデート:

1.7.6 SDK で例をテストしたところ、これは機能しますが、これが古い SDK (または old_dev_appserver) で機能することを確認したいと思います。

4

1 に答える 1

7

問題は、私が思うに、pkg_resources.

関連する機能の一部はosGAE に実装されていませんが、jinja2 または Google のいずれかが回避策を提供しているようです。

これらのリンクは問題を示しています:

http://code.google.com/p/googleappengine/issues/detail?id=60

https://github.com/mitsuhiko/jinja2/issues/143

Google アプリ エンジンの Jinja2 PackageLoader

https://bitbucket.org/tarek/distribute/issue/73/pkg_resources-fails-on-google-app-engine

私は使用しました

jinja_environment = jinja2.Environment(autoescape=True,
loader=jinja2.FileSystemLoader(os.path.join(os.path.dirname(__file__), 'templates')))

template定義を設定しているファイルと同じディレクトリ内の" " ディレクトリからテンプレートを取得するボイラープレートとして。しかし、問題は、zip形式で圧縮されeggs、使用されているファイルに関するものですPackageLoader

__init__.pyパッケージ内にファイルはありますか?ただし、1.7.6で動作すると言っていました。

于 2013-04-01T14:42:54.397 に答える