繁体   English   中英

Python:如何在Flask应用程序中获取导致错误的代码行?

[英]Python: How to get the line in my Flask application which led to an error?

我正在使用Flask建立一个网站。 现在,我遇到了一个错误,该错误给出了回溯,但没有任何线索说明我自己编写的代码的哪一部分导致了错误:

Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/Flask-0.10-py2.7.egg/flask/app.py", line 1836, in __call__
    return self.wsgi_app(environ, start_response)
  File "/Library/Python/2.7/site-packages/Flask-0.10-py2.7.egg/flask/app.py", line 1820, in wsgi_app
    response = self.make_response(self.handle_exception(e))
  File "/Library/Python/2.7/site-packages/Flask-0.10-py2.7.egg/flask/app.py", line 1403, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/Library/Python/2.7/site-packages/Flask-0.10-py2.7.egg/flask/app.py", line 1817, in wsgi_app
    response = self.full_dispatch_request()
  File "/Library/Python/2.7/site-packages/Flask-0.10-py2.7.egg/flask/app.py", line 1478, in full_dispatch_request
    response = self.make_response(rv)
  File "/Library/Python/2.7/site-packages/Flask-0.10-py2.7.egg/flask/app.py", line 1577, in make_response
    rv = self.response_class.force_type(rv, request.environ)
  File "/Library/Python/2.7/site-packages/Werkzeug-0.9.4-py2.7.egg/werkzeug/wrappers.py", line 824, in force_type
    response = BaseResponse(*_run_wsgi_app(response, environ))
  File "/Library/Python/2.7/site-packages/Werkzeug-0.9.4-py2.7.egg/werkzeug/wrappers.py", line 57, in _run_wsgi_app
    return _run_wsgi_app(*args)
  File "/Library/Python/2.7/site-packages/Werkzeug-0.9.4-py2.7.egg/werkzeug/test.py", line 854, in run_wsgi_app
    app_iter = app(environ, start_response)
TypeError: 'numpy.float64' object is not callable

我确实在代码中到处使用numpy,但是看到此stacktrace,我不知道需要从哪里开始在我自己的代码中查找错误。

[编辑]感谢您的评论。 我发现了我的错误; 我确实确实返回了一个小小的浮点数。

但是,它不能解决我有时会在Flask中遇到的潜在问题。 我在哪里可以找到导致错误的代码行? 为方便起见,为什么stacktrace不将行包含在我自己的脚本中。 有没有一种方法可以始终在自己的脚本中返回导致错误的行? 当然,我们都是技术人员,但是我认为对于Flask的新手来说,这是非常非常非常重要的功能。

因此,我将问题的标题改回原来的标题,因为这实际上是这里的基本问题。

任何提示都将受到欢迎!

在这里,我调整了第一个flask脚本,以产生几个错误:

from flask import Flask
app = Flask(__name__)
app.debug = True

@app.route("/")
def hello():
    return "Hello World!"

@app.route("/err")
def bad():
    return 1.234

@app.route("/debugged")
def debugged():
    resp = 1.234
    assert isinstance(resp,str), 'response must be string'
    return resp

if __name__ == "__main__":
    app.run()

当我运行它时,服务器显示以下日志(在生产中,这可能会转到日志文件)。 500行告诉我该错误是由/err调用产生的。

127.0.0.1 - - [16/Feb/2014 09:53:18] "GET /err HTTP/1.1" 500 -
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 1836, in __call__
    return self.wsgi_app(environ, start_response)
...
  File "/usr/local/lib/python2.7/site-packages/werkzeug/test.py", line 854, in run_wsgi_app
    app_iter = app(environ, start_response)
TypeError: 'float' object is not callable

我的bad()函数没有出现在堆栈上,因为它运行成功。 flask代码使用其响应会引发错误。 但是我可以通过跟踪路由来识别我的功能。

如果调用具有assert保护的应用程序,则会得到如下记录日志:

127.0.0.1 - - [16/Feb/2014 09:56:03] "GET /debugged HTTP/1.1" 500 -
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 1836, in __call__
    return self.wsgi_app(environ, start_response)
...
  File "/usr/local/lib/python2.7/site-packages/flask/app.py", line 1461, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/home/paul/mypy/stack21800569.py", line 13, in debugged
    assert isinstance(resp,str), 'response must be string'
AssertionError: response must be string

现在,我可以看到我的debugged()函数正在尝试产生错误的响应。

我还可以添加日志记录:

@app.route("/logged")
def logged():
    resp = '1.234'
    app.logger.debug('logger function response: %s'%resp)
    return resp

产生:

--------------------------------------------------------------------------------
DEBUG in stack21800569 [stack21800569.py:19]:
logger function response: 1.234
--------------------------------------------------------------------------------
127.0.0.1 - - [16/Feb/2014 12:00:51] "GET /logged HTTP/1.1" 200 -

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM