Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Flask @route bug

I'm using Flask 0.9 in an API project, and there seems to be a bug on the @router decorator, or I'm doing something extremely wrong here.

I have these 2 URL, /twitter/authorize and /facebook/authorize, and I'm using the @route for it. The problem is, when I request /twitter/authorize, it's actually the /facebook/authorize function that's answering it.

If I comment the lines of /facebook/authorize function and routing, /twitter/authorize answers the request (as it should be).

I tried to print the request.path inside /facebook/authorize, and it returned

/twitter/authorize

But how can it be, since it's inside /facebook/authorize (and that's the requested url)?

The code for both functions:

@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

The calls to instantiate_api() and instantiate_facebook() just return a valid instance of my clients do facebook and twitter.

Both functions, of course, have different names. I really don't understand what's going on. Is this a bug? Has someone been through this before? If it's a bug, can someone suggest a workaround?

like image 951
Fernando Cezar Avatar asked Dec 19 '25 13:12

Fernando Cezar


1 Answers

(Already answered in the comments, providing an actual answer so this question doesn't show up unanswered any more.)

The problem was the actual code (not that provided in the question) looked something like this:

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

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

Both functions have the same name, so facebook_authorize is defined twice and the second definition "wins".

To avoid problems like this in future, you should regularly run pylint and/or pyflakes against your python code. You can configure most editors to run these automatically as you type. In my editor (vim) I use pyflakes.vim which highlights the second app.route line and gives me this warning:

redefinition of function 'facebook_authorize' from line 5

To stop other people from checking in broken code, you can run pyflakes and/or pylint against all .py files in a "pre-commit hook" for your version control system (manual for subversion) which would reject the commit if such an error existed.

Hope this helps.

like image 57
Day Avatar answered Dec 22 '25 02:12

Day



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!