问题描述
当我在 Google App Engine 中运行 Jinja2 时,我得到了无用的调试信息.我认为这是因为常见问题解答中的这个项目:
When I'm running Jinja2 in Google App Engine, I get useless debugging information. I gather this is because of this item in the FAQ:
如果加速模块未编译并且您使用的是没有 ctypes 的 Python 安装(没有 ctypes 的 Python 2.4、Jython 或 Google 的 AppEngine)Jinja2 无法提供正确的调试信息并且回溯可能不完整.目前对于 Jython 或 AppEngine 没有好的解决方法,因为那里的 ctypes 不可用,并且无法使用加速扩展.
虽然目前没有好的"变通方法,但是否有任何变通方法可以使出现异常时打印的信息更有帮助?
While there is no 'good' workaround for this at the moment, is there any workaround so that the information printed when exceptions arise can be made more helpful?
感谢您的阅读.
布莱恩
推荐答案
您可以通过使用monkeypatching 将_ctypes 和格式塔添加到开发服务器的C 模块白名单来解决此问题.
You can get around this by adding _ctypes and gestalt to the development server's C module whitelist with monkeypatching.
为此,请将以下代码段放在 main.py 的顶部:
To do so, put the following snippet at the top of your 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']
如果您有类似的本地模块需求,您也可以使用此技巧来启用其他 C 模块.请注意,这些模块在您部署后仍然无法实际工作,因此请谨慎行事.
You can also use this trick to enable other C modules, if you have similar local-only module needs. Do note that these modules still won't actually work once you deploy, so tread carefully.
在 SDK 1.6.3 上使用 python2.7 你需要把上面的代码改成:
On SDK 1.6.3 using python2.7 you need to change the above code to:
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']
在适用于 python 2.7 的 SDK 1.8.6 上,试试这个:
On SDK 1.8.6 for python 2.7, try this:
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']
这篇关于在 Google App Engine 中调试 Jinja2的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!