用于 Google App Engine 和 Django 的 Python 调试器
Posted
技术标签:
【中文标题】用于 Google App Engine 和 Django 的 Python 调试器【英文标题】:Debugger in python for Google App Engine and Django 【发布时间】:2012-04-24 19:43:14 【问题描述】:我遇到了一个困扰我一个多星期的问题。我有一个在 Google App Engine 上使用 Django 用 python 编写的项目。该项目有一个登录页面,当我在 Google App Engine 中或使用 dev_server.py c:\project 从命令行运行该应用程序时,它工作正常。当我尝试通过 Wing 或 Pycharm 等调试器运行应用程序时,我无法通过登录页面。尝试登录后,它再次将我带回登录屏幕。当我查看日志时,它在调试器中显示 302(重定向),但通常显示 200(OK)。有人可以解释为什么会这样吗?
谢谢 -迪米特里
【问题讨论】:
这不是一个答案,而是一个可能有帮助的问题。当我尝试使用ipdb
调试GAE 应用程序时,它不起作用,而使用pdb
时它起作用了。可能与您的 IDE 使用的调试器类型有关?
【参考方案1】:
这不是一个很好的答案,因为我对 Wing 或 Pycharm 了解不多。但是 dev_appserver 将标准输入和标准输出重新路由到 WSGI 处理程序。如果你遇到了由 pdb.set_trace() 设置的断点,断点通常会将你放到一个使用 stdin/stdout 的 shell,但是使用 dev_appserver,你会看到调试器 shell 通过管道传输到你的 HTTP,并且没有可用的输入。
我不确定 Wing/Pycharm 是如何处理这个问题的。带有 eclipse 的 Pydev 可以与 dev_appserver 一起使用,但这可能是因为 GAE eclipse 插件。
我发现自己经常在我的代码中嵌入断点并在 shell 中手动调试,主要是因为它的运行速度比在 pydev 调试器中快得多。我这样做是在遇到断点时将 stdin/stdout 重新路由回终端。 http://eatdev.tumblr.com/post/12076034867/using-pdb-on-app-engine
我在 linux 环境中。我确实在 Windows 上使用了 GAE 应用程序启动器,但不是最近。我想我记得应用程序启动器隐藏了启动 dev_appserver 的原始终端,因此您可能必须从命令提示符启动 dev_appserver 才能使其正常工作。如果 Wing 或 Pycharm 在下面使用 pdb,我怀疑您可能需要类似的 hack。
【讨论】:
我通过调试器发现get_current_session是空白的。不知道为什么。当用完调试器时,它很好。这是一台 Windows 64 位机器。 您使用的是 Google 用户 API 吗?该 API 通过设置包含登录用户的环境变量在 dev_appserver 上工作。如果您的调试器对 os.environ 执行任何操作,它可能会搞砸用户 API 正在执行的操作。【参考方案2】:绞尽脑汁一周后,我终于找到了问题所在。 gaesessions 代码是罪魁祸首。我们输入 DEFAULT_LIFETIME = datetime.timedelta(hours=1),原来是 DEFAULT_LIFETIME = datetime.timedelta(days=7)。不知道为什么通过任何调试器(如wing或pycharm)运行它会阻止浏览器获取会话。有趣的是,使用 hours=1 的代码更改在带有翼调试器的 linux 上运行良好。很奇怪!
【讨论】:
在与 Wing IDE 开发人员交谈后,他说 Windows 用户可能希望通过项目属性中的环境字段将 TZ 环境变量设置为 UTC,以解决设置 os.environ['TZ '] 进程运行时(有关 Windows 运行时错误的详细信息,请参阅 Microsoft Windows 上的问题)...这是运行时错误的链接 (wingware.com/doc/install/trouble-win32) 谢谢 -Dimitry以上是关于用于 Google App Engine 和 Django 的 Python 调试器的主要内容,如果未能解决你的问题,请参考以下文章
APNS 不适用于 Google App Engine 上的 AdHoc 分发配置文件
用于跳过文件以忽略 Mercurial 文件的 Google App Engine App.yaml 配置
用于 Google App Engine Python 的 Pygments 不起作用
Google App Engine 上的 python 请求不适用于 HTTPS