4

我正在使用 Visual Studio 的 Python 工具,并且我已经建立了一个带有虚拟环境的项目并在那里安装了 Flask-RESTful。

然后,我只是复制了他们的 hello world 示例

from flask import Flask
from flask.ext.restful import reqparse, abort, Api, Resource

app = Flask(__name__)
app.debug = True
api = Api(app)

TODOS = {
    'todo1': {'task': 'build an API'},
    'todo2': {'task': '?????'},
    'todo3': {'task': 'profit!'},
}


def abort_if_todo_doesnt_exist(todo_id):
    if todo_id not in TODOS:
        abort(404, message="Todo {} doesn't exist".format(todo_id))

parser = reqparse.RequestParser()
parser.add_argument('task', type=str)


# Todo
#   show a single todo item and lets you delete them
class Todo(Resource):
    def get(self, todo_id):
        abort_if_todo_doesnt_exist(todo_id)
        return TODOS[todo_id]

    def delete(self, todo_id):
        abort_if_todo_doesnt_exist(todo_id)
        del TODOS[todo_id]
        return '', 204

    def put(self, todo_id):
        args = parser.parse_args()
        task = {'task': args['task']}
        TODOS[todo_id] = task
        return task, 201


# TodoList
#   shows a list of all todos, and lets you POST to add new tasks
class TodoList(Resource):
    def get(self):
        return TODOS

    def post(self):
        args = parser.parse_args()
        todo_id = 'todo%d' % (len(TODOS) + 1)
        TODOS[todo_id] = {'task': args['task']}
        return TODOS[todo_id], 201

##
## Actually setup the Api resource routing here
##
api.add_resource(TodoList, '/todos')
api.add_resource(Todo, '/todos/<string:todo_id>')

if __name__ == '__main__':
    app.run(debug=True)

一切正常,如果我在开始之前执行的行上放置断点,app.run(debug=True)它们就会被击中(F10 和 F11 工作得很好,并且局部变量按预期更新)

但是,我很想调试处理请求时会发生什么,但是如果我向TodoorTodoList类的方法添加断点,它们永远不会被命中。我添加了代码(如print('here'))以查看它们是否正在被处理并且它们是......而且,它们正在返回我从浏览器打开时所期望的内容。

我在设置中缺少什么吗?

谢谢!

更新:我发现如果我将 VS 附加到运行我的代码的 python.exe 进程,我可以调试这些方法......所以我想现在的问题是:我可以强制 VS 附加到进程一旦像使用常规 .NET 应用程序一样启动它?

4

2 回答 2

10

我有同样的问题(但在 Mac 上使用 PyCharm)。

我相信这与 Flask 在debug=True. 将 debug 设置为 False 让我可以打破视图方法。

于 2014-07-12T22:11:29.350 回答
5

禁用调试解决了断点命中的问题,但缺点是您无法读取异常跟踪输出。

绕过此限制的一种方法是添加:

DEBUG = False
PROPAGATE_EXCEPTIONS = True

到你的配置。

发生异常时,浏览器仍显示“Internal Server Error”消息,但控制台窗口会正常接收异常跟踪。

于 2014-12-18T00:25:52.403 回答