3

我在 API 项目中使用 Flask 0.9,@router 装饰器上似乎有一个错误,或者我在这里做了一些非常错误的事情。

我有这 2 个 URL,/twitter/authorize 和 /facebook/authorize,我正在使用@route。问题是,当我请求 /twitter/authorize 时,实际上是 /facebook/authorize 函数在回答它。

如果我评论 /facebook/authorize 函数和路由的行,/twitter/authorize 会回答请求(应该如此)。

我试图在 /facebook/authorize 中打印 request.path,它返回了

/推特/授权

但它怎么可能,因为它在 /facebook/authorize 里面(那是请求的 url)?

两个函数的代码:

@app.route('/facebook/authorize')
def facebook_autorize():
    callback = request.args.get('callback', None)
    if not callback:
        return error_as_json("must send callback")

    scope = request.args.get('scope', 'email')

    api = instantiate_facebook()

    response = api.authorize(callback = callback)
    response = jsonify(info = response)
    response.status_code = 200
    return response

@app.route('/twitter/authorize')
def twitter_autorize():
    callback = request.args.get('callback', None)
    api = instantiate_api()
    response = api.authorize(callback = callback)
    response = jsonify(info = response)
    response.status_code = 200
    return response

对 instantiate_api() 和 instantiate_facebook() 的调用只返回我的客户做 facebook 和 twitter 的有效实例。

当然,这两个函数都有不同的名称。我真的不明白发生了什么事。这是一个错误吗?以前有人经历过吗?如果这是一个错误,有人可以提出解决方法吗?

4

1 回答 1

2

(已经在评论中回答,提供了一个实际的答案,所以这个问题不会再没有答案了。)

问题是实际代码(不是问题中提供的)看起来像这样:

@app.route('/facebook/authorize')
def facebook_authorize():
    ...

@app.route('/twitter/authorize')
def facebook_authorize():
    ...

两个函数具有相同的名称,因此facebook_authorize定义了两次,第二个定义“获胜”。

为避免将来出现此类问题,您应该定期对您的 python 代码运行pylint和/或pyflakes 。您可以将大多数编辑器配置为在您键入时自动运行它们。在我的编辑器(vim)中,我使用pyflakes.vim突出显示第二app.route行并给我这个警告:

从第 5 行重新定义函数“facebook_authorize”

为了阻止其他人签入损坏的代码,您可以针对您的版本控制系统( subversion 手册.py)的“预提交挂钩”中的所有文件运行 pyflakes 和/或 pylint,如果存在此类错误,它将拒绝提交。

希望这可以帮助。

于 2012-12-17T10:17:41.570 回答