Flask url_for producing wrong URL

Question:

The url_for generator in flask is not working for one of my views (it works for other views). The generator is giving /user/?name=Joe while I expect /u/Joe.

In the template I am trying to get the URL for the user page using: {{ url_for('user', name = g.user.name ) }}

This is the corresponding view function:

@app.route('/u/<name>')
@login_required
def user(name):

At first this was working but something changed. I have tried changing the view name and url with no luck.

Any thoughts? I am at a loss on this one…

The full app is available on GitHub: https://github.com/joehand/weight-and-more-tracker

Edit: The @login_required decorated is the one provided by Flask-login.

Additionally, removing the <name> variable does not solve the issue. The URL is then just /user.

Asked By: joehand

||

Answers:

did you ‘wrapped’ your function in login_required decorator? In your case name is supplied into url as a query string, not a flask view-function argument – maybe flask does not have a grip of the argument specification of your decorated user view-function.

from the docs:

So let’s implement such a decorator. A decorator is a function that
returns a function. Pretty simple actually. The only thing you have to
keep in mind when implementing something like this is to update the
name, module and some other attributes of a function. This is often forgotten, but you don’t have to do that by hand, there is a
function for that that is used like a decorator (functools.wraps()).

from functools import wraps
from flask import g, request, redirect, url_for

def login_required(f):
    @wraps(f)
    def decorated_function(*args, **kwargs):
        if g.user is None:
            return redirect(url_for('login', next=request.url))
        return f(*args, **kwargs)
    return decorated_function
Answered By: thkang

In api.py you are registering a view with the name ‘user’ that is probably conflicting with the method named ‘user’.

Answered By: Craig
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.