3

APIプロジェクトでFlask0.9を使用していますが、@ routerデコレータにバグがあるようです。または、ここで非常に間違ったことをしています。

/ twitter/authorizeと/facebook/ authorizeの2つのURLがあり、@routeを使用しています。問題は、/ twitter / authorizeをリクエストすると、実際には/ facebook/authorize関数がそれに応答することです。

/ facebook / authorize関数とルーティングの行にコメントすると、/ twitter / authorizeがリクエストに応答します(そうあるべきです)。

/ facebook / authorize内にrequest.pathを印刷しようとしましたが、返されました

/ twitter / authorize

しかし、それは/ 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

instanceiate_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、2回定義され、2番目の定義が「優先」されます。

今後このような問題を回避するには、Pythonコードに対して定期的にpylintpyflakesを実行する必要があります。入力時にこれらを自動的に実行するように、ほとんどのエディターを構成できます。私のエディター(vim)では、2行目を強調表示して次の警告を表示するpyflakes.vimを使用しています。app.route

5行目からの関数「facebook_authorize」の再定義

他の人が壊れたコードをチェックインするのを防ぐために、バージョン管理システム( subversionのマニュアル.py)の「pre-commitフック」内のすべてのファイルに対してpyflakesやpylintを実行すると、そのようなエラーが存在する場合にコミットが拒否されます。

お役に立てれば。

于 2012-12-17T10:17:41.570 に答える