在Google App Engine中调试Jinja2

Bri*_*unt 28 python debugging google-app-engine jinja2

当我在Google App Engine中运行Jinja2时,我得到了无用的调试信息.我收集这是因为FAQ中的这个项目:

我的追溯看起来很奇怪.发生了什么?

如果未编译speedups模块并且您使用的是没有ctypes的Python安装(没有ctypes的Python 2.4,Jython或Google的AppEngine),Jinja2无法提供正确的调试信息,并且回溯可能不完整.目前没有针对Jython或AppEngine的良好解决方法,因为ctypes在那里不可用,并且不可能使用speedups扩展.

虽然目前没有"良好"的解决方法,是否有任何解决方法,以便在出现异常时打印的信息可以更有帮助?

谢谢你的阅读.

布赖恩

小智 29

你可以通过monkeypatching将_ctypes和gestalt添加到开发服务器的C模块白名单中来解决这个问题.

为此,请将以下代码段放在main.py的顶部:

import os
if os.environ.get('SERVER_SOFTWARE', '').startswith('Dev'):
    # Enable ctypes for Jinja debugging
    from google.appengine.tools.dev_appserver import HardenedModulesHook
    HardenedModulesHook._WHITE_LIST_C_MODULES += ['_ctypes', 'gestalt']
Run Code Online (Sandbox Code Playgroud)

如果您具有类似的仅本地模块需求,您还可以使用此技巧启用其他C模块.请注意,部署后这些模块仍然无法正常工作,因此请谨慎操作.

在使用python2.7的SDK 1.6.3上,您需要将上面的代码更改为:

import os
if os.environ.get('SERVER_SOFTWARE', '').startswith('Dev'):
    # Enable ctypes for Jinja debugging
    import sys
    from google.appengine.tools.dev_appserver import HardenedModulesHook
    assert isinstance(sys.meta_path[0], HardenedModulesHook)
    sys.meta_path[0]._white_list_c_modules += ['_ctypes', 'gestalt']
Run Code Online (Sandbox Code Playgroud)

在SDK 1.8.6 for python 2.7上,试试这个:

PRODUCTION_MODE = not os.environ.get(
    'SERVER_SOFTWARE', 'Development').startswith('Development')
if not PRODUCTION_MODE:
    from google.appengine.tools.devappserver2.python import sandbox
    sandbox._WHITE_LIST_C_MODULES += ['_ctypes', 'gestalt']
Run Code Online (Sandbox Code Playgroud)

  • 这似乎对我在python27运行时没有用.python2.7有可能略有改变吗? (2认同)
  • 请在http://code.google.com/p/googleappengine/issues/detail?id=7164上解决此问题 (2认同)
  • 从"import HardenedModulesHook"行中我收到以下错误:"ImportError:没有名为simplejson的模块".SDK:1.8.1 Python:2.7.它使用两种方法 (2认同)