我在一个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/