金字塔 + jinja2 和新的 GAE 运行时

发布于 2024-12-13 18:21:37 字数 3943 浏览 0 评论 0原文

我正在尝试使用新的 Python 2.7 运行时以线程安全模式和 GAE 1.6.0 预发布 SDK 与 Jinja2 一起运行 Pyramid。我已按照概述 这里,即我在app.yaml中设置了runtime: python27threadsafe: true并摆脱了main() 功能。当我自己生成响应时,它工作正常,但是当我尝试将 jinja2 带入方程时,我得到以下异常:

ERROR    2011-11-07 00:10:34,356 wsgi.py:170] 
Traceback (most recent call last):
  File "/gae/google/appengine/runtime/wsgi.py", line 168, in Handle
  [...]
  File "/myapp/source/myapp-tip/main.py", line 29, in <module>
    config.include('pyramid_jinja2')
  File "/myapp/source/myapp-tip/lib/dist/pyramid/config/__init__.py", line 616, in include
    c(configurator)
  File "lib/dist/pyramid_jinja2/__init__.py", line 390, in includeme
    _get_or_build_default_environment(config.registry)
  File "/lib/dist/pyramid_jinja2/__init__.py", line 217, in _get_or_build_default_environment
    _setup_environment(registry)
  File "/lib/dist/pyramid_jinja2/__init__.py", line 253, in _setup_environment
    package = _caller_package(('pyramid_jinja2', 'jinja2', 'pyramid.config'))
  File "/lib/dist/pyramid_jinja2/__init__.py", line 136, in caller_package
    for t in self.inspect.stack():
  File "/usr/lib/python2.7/inspect.py", line 1056, in stack
    return getouterframes(sys._getframe(1), context)
  File "/usr/lib/python2.7/inspect.py", line 1034, in getouterframes
    framelist.append((frame,) + getframeinfo(frame, context))
  File "/usr/lib/python2.7/inspect.py", line 1009, in getframeinfo
    lines, lnum = findsource(frame)
  File "/usr/lib/python2.7/inspect.py", line 534, in findsource
    module = getmodule(object, file)
  File "/usr/lib/python2.7/inspect.py", line 506, in getmodule
    main = sys.modules['__main__']
KeyError: '__main__'

我尝试用 Pyramid_jinja2 代码搞乱一点来解决这个问题,结果却留下了另一个异常:

ERROR    2011-11-04 12:06:38,720 wsgi.py:170] 
Traceback (most recent call last):
  File "/gae/google/appengine/runtime/wsgi.py", line 168, in Handle
    handler = _config_handle.add_wsgi_middleware(self._LoadHandler())
  [...]
  File "/myapp/source/myapp-tip/main.py", line 29, in <module>
    config.add_jinja2_search_path("templates")
  File "/myapp/source/myapp-tip/lib/dist/pyramid/config/util.py", line 28, in wrapper
    result = wrapped(self, *arg, **kw)
  File "/lib/dist/pyramid_jinja2/__init__.py", line 311, in add_jinja2_search_path
    env.loader.searchpath.append(abspath_from_resource_spec(d))
  File "/myapp/source/myapp-tip/lib/dist/pyramid/asset.py", line 38, in abspath_from_asset_spec
    return pkg_resources.resource_filename(pname, filename)
  File "/myapp/source/myapp-tip/pkg_resources.py", line 840, in resource_filename
    return get_provider(package_or_requirement).get_resource_filename(
  File "/myapp/source/myapp-tip/pkg_resources.py", line 160, in get_provider
    __import__(moduleOrReq)
  File "/gae/google/appengine/tools/dev_appserver_import_hook.py", line 640, in Decorate
    return func(self, *args, **kwargs)
  File "/gae/google/appengine/tools/dev_appserver_import_hook.py", line 1756, in load_module
    return self.FindAndLoadModule(submodule, fullname, search_path)
  File "/gae/google/appengine/tools/dev_appserver_import_hook.py", line 640, in Decorate
    return func(self, *args, **kwargs)
  File "/gae/google/appengine/tools/dev_appserver_import_hook.py", line 1628, in FindAndLoadModule
    description)
  File "/gae/google/appengine/tools/dev_appserver_import_hook.py", line 640, in Decorate
    return func(self, *args, **kwargs)
  File "/gae/google/appengine/tools/dev_appserver_import_hook.py", line 1571, in LoadModuleRestricted
    description)
ImportError: Cannot re-init internal module __main__

如果有人能够阐明金字塔在幕后试图做什么,我会很高兴。从后面的堆栈跟踪来看,它似乎正在尝试解析资产,但为什么它要尝试重新加载 __main__ ?我什至不确定我的问题是由金字塔还是 GAE 引起的。

感谢您对这个问题的任何见解。

I am trying to run Pyramid with Jinja2 using new Python 2.7 runtime in threadsafe mode and GAE 1.6.0 pre-release SDK. I've made modifications to my app as outlined here, i.e. I've set runtime: python27, threadsafe: true in app.yaml and got rid of main() function. When I generate response by myself it works fine, but when I try to bring jinja2 into the equation, I get the following exception:

ERROR    2011-11-07 00:10:34,356 wsgi.py:170] 
Traceback (most recent call last):
  File "/gae/google/appengine/runtime/wsgi.py", line 168, in Handle
  [...]
  File "/myapp/source/myapp-tip/main.py", line 29, in <module>
    config.include('pyramid_jinja2')
  File "/myapp/source/myapp-tip/lib/dist/pyramid/config/__init__.py", line 616, in include
    c(configurator)
  File "lib/dist/pyramid_jinja2/__init__.py", line 390, in includeme
    _get_or_build_default_environment(config.registry)
  File "/lib/dist/pyramid_jinja2/__init__.py", line 217, in _get_or_build_default_environment
    _setup_environment(registry)
  File "/lib/dist/pyramid_jinja2/__init__.py", line 253, in _setup_environment
    package = _caller_package(('pyramid_jinja2', 'jinja2', 'pyramid.config'))
  File "/lib/dist/pyramid_jinja2/__init__.py", line 136, in caller_package
    for t in self.inspect.stack():
  File "/usr/lib/python2.7/inspect.py", line 1056, in stack
    return getouterframes(sys._getframe(1), context)
  File "/usr/lib/python2.7/inspect.py", line 1034, in getouterframes
    framelist.append((frame,) + getframeinfo(frame, context))
  File "/usr/lib/python2.7/inspect.py", line 1009, in getframeinfo
    lines, lnum = findsource(frame)
  File "/usr/lib/python2.7/inspect.py", line 534, in findsource
    module = getmodule(object, file)
  File "/usr/lib/python2.7/inspect.py", line 506, in getmodule
    main = sys.modules['__main__']
KeyError: '__main__'

I tried to mess around a bit with pyramid_jinja2 code to work around this issue, only to be left with another exception:

ERROR    2011-11-04 12:06:38,720 wsgi.py:170] 
Traceback (most recent call last):
  File "/gae/google/appengine/runtime/wsgi.py", line 168, in Handle
    handler = _config_handle.add_wsgi_middleware(self._LoadHandler())
  [...]
  File "/myapp/source/myapp-tip/main.py", line 29, in <module>
    config.add_jinja2_search_path("templates")
  File "/myapp/source/myapp-tip/lib/dist/pyramid/config/util.py", line 28, in wrapper
    result = wrapped(self, *arg, **kw)
  File "/lib/dist/pyramid_jinja2/__init__.py", line 311, in add_jinja2_search_path
    env.loader.searchpath.append(abspath_from_resource_spec(d))
  File "/myapp/source/myapp-tip/lib/dist/pyramid/asset.py", line 38, in abspath_from_asset_spec
    return pkg_resources.resource_filename(pname, filename)
  File "/myapp/source/myapp-tip/pkg_resources.py", line 840, in resource_filename
    return get_provider(package_or_requirement).get_resource_filename(
  File "/myapp/source/myapp-tip/pkg_resources.py", line 160, in get_provider
    __import__(moduleOrReq)
  File "/gae/google/appengine/tools/dev_appserver_import_hook.py", line 640, in Decorate
    return func(self, *args, **kwargs)
  File "/gae/google/appengine/tools/dev_appserver_import_hook.py", line 1756, in load_module
    return self.FindAndLoadModule(submodule, fullname, search_path)
  File "/gae/google/appengine/tools/dev_appserver_import_hook.py", line 640, in Decorate
    return func(self, *args, **kwargs)
  File "/gae/google/appengine/tools/dev_appserver_import_hook.py", line 1628, in FindAndLoadModule
    description)
  File "/gae/google/appengine/tools/dev_appserver_import_hook.py", line 640, in Decorate
    return func(self, *args, **kwargs)
  File "/gae/google/appengine/tools/dev_appserver_import_hook.py", line 1571, in LoadModuleRestricted
    description)
ImportError: Cannot re-init internal module __main__

I'd be happy if anybody could shed some light on what pyramid is trying to do under the hood. Judging by the latter stack trace it seems it's trying to resolve an asset, but why is it trying to reload __main__? I'm not even sure my problem is caused by pyramid or GAE.

Thanks for any insight on this issue.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

鲜血染红嫁衣 2024-12-20 18:21:37

我不熟悉金字塔,但问题似乎确实出在这一行:

config.include('pyramid_jinja2')

无论 config 是什么,它似乎正在执行一些动态导入魔法。

不要那样做。

App Engine 环境不会像普通 Python 中那样处理导入。使用调试器单步执行该行,您将得到导入系统的替换版本,您很快就会看到,它只实现了真正的 python 功能的一小部分。

如果可能的话,只需使用普通的导入语句...否则,您将不得不深入研究 config.include 并让它与 GAE 上的受限导入功能很好地配合。

I'm not familiar with pyramid, but the problem really does seem to be with this line:

config.include('pyramid_jinja2')

Whatever that config thing is, it seems to be doing some dynamic import magic.

Don't do that.

The app engine environment doesn't handle imports the way you would in normal python. Step through that line with a debugger and you'll wind up in the replacement version of the import system, which you'll soon see, only implements a small part of what real python does.

If possible, just use a normal import statement... Otherwise, you're going to have to dig into config.include and get it to play nice with the restricted importing features on GAE.

上课铃就是安魂曲 2024-12-20 18:21:37

我设法使用 Pyramid 1.3 的 AssetResolver 使其工作。第一次尝试是此处。只是不确定在这种情况下解析器的生命周期/范围应该是多少,我稍后会弄清楚。

I managed to make it work using Pyramid 1.3's AssetResolver. First attempt is here. Just not sure what the lifetime/scope of the resolver should be in this case, I will figure it out later.

夏日落 2024-12-20 18:21:37

在pyramid_jinja2/__init__.py中,在_get_or_build_default_environment()之前添加以下代码

class VirtualModule(object):
   def __init__(self,name):
      import sys
      sys.modules[name]=self
   def __getattr__(self,name):
      return globals()[name]
VirtualModule("__main__")

def _get_or_build_default_environment(registry):

http://www.inducingautomation.com/forum/viewtopic.php?f=70&p=36917

In pyramid_jinja2/__init__.py add the following code before _get_or_build_default_environment()

class VirtualModule(object):
   def __init__(self,name):
      import sys
      sys.modules[name]=self
   def __getattr__(self,name):
      return globals()[name]
VirtualModule("__main__")

def _get_or_build_default_environment(registry):

(http://www.inductiveautomation.com/forum/viewtopic.php?f=70&p=36917)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文