我在一个API项目中使用Flask 0.9,而@router decorator上似乎有一个bug,或者我在这里做了一些非常错误的事情。
我有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()只会返回一个有效的客户端实例do facebook和twitter。
当然,这两个函数都有不同的名称。我真的不明白怎么回事。这是虫子吗?以前有人经历过吗?如果是虫子,有人能提出解决办法吗?

最佳答案

(已经在评论中给出了答案,提供了一个实际的答案,这样这个问题就不会再出现没有答案的问题了。)
问题是实际的代码(不是问题中提供的代码)看起来像这样:

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

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

两个函数都有相同的名称,因此facebook_authorize定义了两次,第二个定义“wins”。
为了避免将来出现这种问题,您应该定期对python代码运行pylint和/或pyflakes。您可以将大多数编辑器配置为在键入时自动运行这些编辑器。在我的编辑器(vim)中,我使用pyflakes.vim来突出显示第二行app.route并给出以下警告:
从第5行重新定义“facebook_authorize”功能
为了阻止其他人检查破代码,可以在PyFLACK和/或PyLink中对所有的“cc>文件”在版本控制系统(manual for subversion)中运行“预提交钩子”,如果存在这样的错误,将拒绝提交。
希望这有帮助。

关于python - flask @route bug,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13893533/

10-11 07:41