3 votes

Bug de Flask @route

J'utilise Flask 0.9 dans un projet API, et il semble y avoir un bug sur le décorateur @router, ou je fais quelque chose d'extrêmement mauvais ici.

J'ai ces 2 URL, /twitter/authorize et /facebook/authorize, et j'utilise le @route pour cela. Le problème est que lorsque je demande /twitter/authorize, c'est en fait la fonction /facebook/authorize qui y répond.

Si je commente les lignes de la fonction et du routage de /facebook/authorize, /twitter/authorize répond à la demande (comme il se doit).

J'ai essayé d'imprimer la requête.path dans /facebook/authorize, et cela a retourné

/twitter/authorize

Mais comment est-ce possible, puisque c'est dans /facebook/authorize (et c'est l'url demandée) ?

Le code pour les deux fonctions :

@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

Les appels à instantiate_api() et instantiate_facebook() renvoient simplement une instance valide de mes clients facebook et twitter.

Les deux fonctions portent bien sûr des noms différents. Je ne comprends vraiment pas ce qui se passe. S'agit-il d'un bug ? Quelqu'un a-t-il déjà été confronté à ce problème ? Si c'est un bogue, quelqu'un peut-il suggérer une solution de contournement ?

2voto

Day Points 4103

(Déjà répondu dans les commentaires, en fournissant une réponse réelle afin que cette question ne reste plus sans réponse).

Le problème était que le code réel (pas celui fourni dans la question) ressemblait à quelque chose comme ceci :

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

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

Les deux fonctions ont le même nom donc facebook_authorize est défini deux fois et la deuxième définition "gagne".

Pour éviter ce genre de problèmes à l'avenir, vous devriez régulièrement exécuter le programme pylint et/ou pyflakes contre votre code python. Vous pouvez configurer la plupart des éditeurs pour qu'ils les exécutent automatiquement. au fur et à mesure que vous tapez . Dans mon éditeur (vim), j'utilise pyflakes.vim qui met en évidence le deuxième app.route et me donne cet avertissement :

redéfinition de la fonction 'facebook_authorize' à partir de la ligne 5

Pour empêcher d'autres personnes de vérifier du code cassé, vous pouvez exécuter pyflakes et/ou pylint contre tous les fichiers .py dans un "hook de pré-commit" pour votre système de contrôle de version ( manuel pour subversion ) qui rejetterait la livraison si une telle erreur existait.

J'espère que cela vous aidera.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X