Возврат колбы «Не удалось создать URL для конечной точки 'index'» после добавления декоратора - PullRequest
0 голосов
/ 03 июня 2018

У меня есть пользовательское приложение, написанное с помощью flask, и я пытаюсь добавить декоратор аутентификации (d_auth), чтобы мне не приходилось проверять, прошел ли пользователь аутентификацию в каждой функции маршрутизации.Декоратор работает нормально, но проблема в том, что url_for("index") не удается после входа пользователя. Вот мой код для декоратора и функции маршрутизации index, в которую я добавил этот декоратор:

def d_auth(func):
    wraps(func)
    def decorated(*ags, **kgs):
        #print("DECORATOR_RUNNING")
        login_valid = (flask.session.get('auth_email') != None)
        if not login_valid: 
            return redirect(url_for("login"))
        else:
            #func(*args, **kwargs)
            return func(*ags, *kgs)
            #pass
    return decorated

@app.route("/", methods=["GET", "POST"])
@d_auth
def index():
    creds = gdrive.get_gdrive_credentials(session['auth_user_id'])
    if not creds:
        info = "<h2 id='lblGAuthStatus' class='text-center text-danger'> <span class='glyphicon glyphicon-alert'></span> NOT Authenticated. <a href='/gdrive_auth'>Click here to Authenticate.</a></h2>"
    elif creds.access_token_expired:
        info = "<h2 id='lblGAuthStatus' class='text-center text-danger'> <span class='glyphicon glyphicon-alert'></span> Access Token EXPIRED. <a href='/gdrive_auth'>Click here to Authenticate.</a></h2>"
    else:
        info = "<h2 id='lblGAuthStatus' class='text-center text-success'> <span class='glyphicon glyphicon-ok'></span> Successfully Authenticated.</h2>"

    return render_template('static/index.html', info=info)

В основном, декоратор проверяет, вошел ли пользователь в систему (not login_valid) и перенаправляет ли его на страницу входа, если он этого не сделал.Это работает отлично.Проблема в том, что как только пользователь входит в систему и страница входа снова пытается перенаправить его на страницу индекса, он выдает эту ошибку:

werkzeug.routing.BuildError: Could not build url for endpoint 'index'. Did you mean 'view' instead?

Вот код для маршрута /login:

@app.route("/login", methods=["GET", "POST"])
def login():
    if request.method == 'GET':
        return render_template("static/login.html")
    elif request.method == 'POST':
        email = request.form['email']
        password = request.form['password']
        conn, cursor = db.opendb()
        cursor.execute("select id, is_admin, first_name, last_name from user where email=? and password=?", (email, password))
        row = cursor.fetchone()
        if row == None:
            return render_template("static/login.html", error="Invalid Credentials")
        else:
            session['auth_user_id'] = str(row['id'])
            session['auth_email'] = email
            session['auth_first_name'] = row['first_name']
            session['auth_last_name'] = row['last_name']
            session['auth_is_admin'] = row['is_admin']
            return redirect(url_for("index"))

В этой последней строке вызывается url_for("index"), и именно здесь происходит ошибка.Я знаю, что вместо этого могу работать с url_for("/"), который работает, но я хочу исправить это навсегда, чтобы что-то еще не могло перестать работать в моей относительно большой кодовой базе.

1 Ответ

0 голосов
/ 03 июня 2018

Я только что нашел ответ на свой вопрос здесь .Оказывается, я должен обернуть функцию декоратора, используя @wraps(func), а не просто wraps(func), как я сделал.Интересно, почему это не выдало ошибку!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...