sie*_*z0r 4 python google-app-engine jinja2
我正在尝试使用PackageLoader jinja2提供但我无法让它工作.
在我的app.yaml我已经声明了所需的库:
libraries:
- name: jinja2
version: latest
- name: setuptools
version: latest
Run Code Online (Sandbox Code Playgroud)
我可以创建的最小的例子:
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)
Run Code Online (Sandbox Code Playgroud)
该包common存在于目录中lib/somepackage,templates并且包含一个包含文件的包test.html.html文件只包含文本'test'.
当PackageLoader构建它provider始终是一个NullProvider在谷歌时,应用程序引擎.当我手动请求提供者时,我得到了一个DefaultProvider明显错误的地方.
要请求提供商我保证lib/somepackage是在sys.path通过转到目录,则:
>>> import pkg_resources
>>> provider = pkg_resources.get_provider('common')
>>> provider
<pkg_resources.DefaultProvider instance at 0x8490b2c>
Run Code Online (Sandbox Code Playgroud)
如果在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
Run Code Online (Sandbox Code Playgroud)
当我使用它FileSystemLoader而不是它有效,但是这不会在拉链中起作用我想:
import common.templates
env = Environment(loader=FileSystemLoader(common.templates.__path__))
Run Code Online (Sandbox Code Playgroud)
我已经看到了这个问题,但这不是问题所在.
更新:
我刚刚在1.7.6 SDK中测试了这个例子,但这很有用,但我很乐意看到这个工作在旧的SDK(或old_dev_appserver)上.
我认为问题在于pkg_resources.
一些os相关的功能没有在GAE中实现,但是jinja2或Google提供了一个解决方法.
这些链接说明了这个问题:
http://code.google.com/p/googleappengine/issues/detail?id=60
https://github.com/mitsuhiko/jinja2/issues/143
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')))
Run Code Online (Sandbox Code Playgroud)
作为样板来从与template设置定义的文件相同的目录中的" "目录中获取模板.但问题是关于压缩eggs和使用的文件PackageLoader
__init__.py包里面有文件吗?但是你说它在1.7.6上工作了.
| 归档时间: |
|
| 查看次数: |
3380 次 |
| 最近记录: |