我正在使用Google App Engine开发Flask应用,并使用本地开发服务器(即dev_appserver.py
)在本地计算机上对其进行测试。
当我的应用程序在app.py脚本的顶层遇到运行时异常时,我在终端中看到了运行dev_appserver.py
的回溯。但是,当在Flask路由中遇到异常时,似乎dev服务器正在捕获并处理异常。我在终端输出中看到的只是路由返回500响应状态:
INFO 2017-06-20 13:18:31,998 devappserver2.py:116] Skipping SDK update check.
INFO 2017-06-20 13:18:32,025 api_server.py:297] Starting API server at: http://localhost:43843
INFO 2017-06-20 13:18:32,037 dispatcher.py:209] Starting module "default" running at: http://localhost:8080
INFO 2017-06-20 13:18:32,037 admin_server.py:116] Starting admin server at: http://localhost:8000
INFO 2017-06-20 13:18:36,048 module.py:809] default: "GET /cron/batch/basket HTTP/1.1" 500 291
我可以通过传递dev_appserver.py
标志--logs_path=sqlite.db
,然后在sqlite文件中查看包含回溯的AppLogs
表的内容来找到回溯的一种hacky方式。但这不是一个有用的工作流程。
任何人都知道如何处理在处理Flask路线时遇到的异常的追溯?
答案 0 :(得分:1)
这样的事情可能有所帮助:
app = Flask(__name__)
production_environment = os.getenv('SERVER_SOFTWARE').startswith('Google App Engine/')
if not production_environment:
app.debug = True
答案 1 :(得分:0)
我解决这个问题的方法是创建一个装饰器,它捕获任何异常,将其回溯打印到stdout,然后重新引发异常,然后我将其添加到我想要调试的路径中:
import traceback
import sys
def print_traceback(func):
"""Decorator that prints exception tracebacks to stdout"""
def wrapper(*args, **kwargs):
try:
return func(*args, **kwargs)
except Exception, e:
print "Exception:"
print "============================="
traceback.print_exc(file=sys.stdout)
print "============================="
raise e
return wrapper
@app.route('/some/route')
@print_traceback
def some_route(task):
pass