2017-06-20 28 views
1

我使用谷歌應用程序引擎開發的燒瓶應用程序,並使用本地開發服務器(即dev_appserver.py)我的本地機器上測試它的錯誤。查看谷歌應用程序引擎的Python回溯在本地開發服務器由於瓶路線

當我的應用程序在app.py腳本的頂層遇到運行時異常時,我在終端運行dev_appserver.py中看到回溯。但是,當在Flask路由中遇到異常時,似乎開發服務器正在捕獲並處理異常。所有我可以在終端輸出看到的是,路由返回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,然後在觀看AppLogs表的內容包含traceback的sqlite文件。但這不是一個有用的工作流程。

任何人都知道我怎樣才能得到回溯在燒瓶路線的處理遇到一個例外呢?

+0

我開始'dev_appserver.py'在一個終端窗口,日誌在該窗口流。默認情況下,那裏的日誌將包含所有回溯。你在終端窗口看到了什麼? –

+0

有趣。我更新了輸出的問題,其中包括啓動日誌記錄和GET錯誤的路由請求。 – nedned

+0

這是我看到回溯的地方。將'assert False'添加到您的代碼中,並查看是否會在此處顯示回溯。 –

回答

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 
1

像這樣的東西可能會有所幫助:

app = Flask(__name__) 

production_environment = os.getenv('SERVER_SOFTWARE').startswith('Google App Engine/') 

if not production_environment: 
    app.debug = True