Перенаправления в Flask/Werkzeug не меняют URL-адрес

Я очень хорошо разбираюсь в веб-разработке на Python, поэтому, пожалуйста, потерпите меня.

Я пытаюсь настроить очень простой вход в систему, используя Flask и приведенный ниже код:

@app.route('/')
def index():
        if verifyLoggedIn():
                someData = gatherSomeData()
                return render_template('main.html', data=someData)
        else:
                return redirect(url_for('login'))

@app.route('/login/', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        if request.form['usr'] == user and request.form['pwd'] == password:
                session['user'] = request.form['usr']
                session['passwd'] = request.form['pwd']
                return redirect(url_for('index'))
        else:
                return render_template('out.html',name=request.form['usr'])
    else:
        return render_template('login.html')

Когда я захожу на страницу, перейдя на «localhost: 5000/», я правильно перенаправляюсь на «localhost: 5000/login/». Однако после входа в систему страница загружает «main.html», но на панели URL по-прежнему отображается «localhost: 5000/login/». Проблема в том, что если я нажму кнопку обновления, чтобы получить новое значение «someData», я вернусь на экран входа в систему. Я считаю, что это имеет место после любого почтового действия. Я упускаю здесь что-то очень фундаментальное?


person arobinson    schedule 10.07.2013    source источник
comment
Вы установили секрет для своего приложения (сессии Flask не будут работать без них)?   -  person Sean Vieira    schedule 10.07.2013


Ответы (3)


Спасибо тем, кто ответил, но после долгих поисков мне удалось обнаружить, что ответ уже был на stackoverflow: p (извините, я действительно много оглядывался, прежде чем спросить)

URL-адрес в браузере не обновлено после вызова перенаправления( url_for('xxx' )) в Flask с jQuery mobile

На самом деле проблема была вызвана jquery mobile и отсутствием атрибута data-url.

person arobinson    schedule 11.07.2013

Для меня работает следующий код, он в основном такой же, как и вы:

from flask import Flask, request, render_template, session, redirect, url_for

app = Flask(__name__)
app.config['SECRET_KEY'] = 'sldkf'

@app.route('/')
def index():
    if session['user']:
        return render_template('main.html')
    else:
        return redirect(url_for('login'))

@app.route('/login/', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        user = 'test'
        password = 'test'
        if request.form['usr'] == user and request.form['pwd'] == password:
            session['user'] = request.form['usr']
            session['passwd'] = request.form['pwd']
            return redirect(url_for('index'))
        else:
            return render_template('login.html')
    else:
        return render_template('login.html')

@app.route('/logout/', methods=['GET'])
def logout():
    session['user'] = None
    return redirect(url_for('login'))

if __name__ == '__main__':
    app.run(debug=True)
person Chris McKinnel    schedule 10.07.2013

Вы должны проверить, аутентифицирован ли пользователь в вашем маршруте входа. Если это так, перенаправьте на «индексный» маршрут, используя return redirect(url_for('index')).

person Raj    schedule 10.07.2013