【问题标题】:Flask @route bug烧瓶@route错误
【发布时间】:2012-12-03 07:57:06
【问题描述】:

我在 API 项目中使用 Flask 0.9,@router 装饰器似乎存在错误,或者我在这里做的非常错误。

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

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

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

/twitter/授权

但是怎么可能呢,因为它在 /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 的有效实例。

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

【问题讨论】:

  • 我编辑了问题以包含一些代码。
  • Both functions, of course, have different names. - 真的吗?
  • 确实如此。我在这里复制/粘贴的错误(我不得不修改一些东西)。其中之一是 twitter_authorize,另一个是 facebook_authorize。我将再次编辑问题中的代码。
  • 不,你是对的,乔恩。在过去的修订版中,它们确实有不同的名称。肯定是有人改了,我没注意到,只是在主库中检查了一下(我的本地版本不同)。解决了,谢谢!

标签: python web-applications routes flask


【解决方案1】:

(已在 cmets 中回答,提供实际答案,因此此问题不再显示为未回答。)

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

@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”

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

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2021-04-29
    • 2013-08-19
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-10
    • 2017-01-12
    • 2017-07-17
    相关资源
    最近更新 更多