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.

Was it helpful?

Solution

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

OTHER TIPS

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
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top