2017-02-16 9 views
0

У меня есть webapp, где я не использую Flask-login. Если пользователь посещает ссылку и не входит в систему, я перенаправляю пользователя на страницу входа. Я выполняю эту настройку «имя пользователя» в сеансе и проверяю, что когда пользователь пытается получить доступ к какой-либо ссылке напрямую без входа в систему, то в этом случае имя пользователя будет равно нулю.Flask как перенаправить на предыдущую страницу после успешного входа в систему

Я попытался следовать этому SO solution, но следующий параметр всегда отсутствует. Я попробовал оба решения, но не могу заставить их работать.

username = session.get('username') 
if username: 
    # go to home 
else: 
    next_url = request.url 
    login_url = '%s?next=%s' % (url_for('login'), next_url) 
    return redirect(login_url) 

Второе решение

username = session.get('username') 
if username: 
    # go to home 
else: 
    return redirect(url_for('login', next= request.url)) 

печати (request.url) = локальный: 5000/visitPage

Войти Функция

if 'next' in request.args: 
    return redirect(next) 
    else: 
    return redirect(url_for("user.index")) 

Вот когда я печатаю (рядом), то is None
Но логин url имеет следующий аргумент

http://localhost:5000/login?next=http%3A%2F%2Flocalhost%3A5000%2FvisitPage

+0

Поместите здесь распечатка request.url из вторых решений. Если это None, 'url_for' пропускает его и не передает в качестве параметра запроса – theodor

+0

Я включил печать. Это None, но request.url перед тем, как запрос и url будут иметь следующий, так почему это Null? Что-то не так, как я проверяю дальше? – jas

+0

Вы используете функцию входа в систему, используя методы GET или POST? Если это POST, вы должны проверить request.form.get ('next') – theodor

ответ

0

Там может быть несколько проблем:

  • url_for пропускаются командой Param запрос, если он имеет значение None
  • ваша конечная точка Логин принимает POST запросы. В таком случае вы должны получить next Param таким образом, request.form.get('next')

Если эти советы не помогут вам, вы можете положить import ipdb;ipdb.set_trace() (может быть, вы должны установить ipdb первый) в коде и попытаться отладить его лучше понять, что здесь происходит, или поставить больше контекста для понимания вашей проблемы.

+0

Проблема была в функции входа. Функция func выполняет проверку и перенаправляет пользователя, если данные формы недействительны. Таким образом, в этом случае первый вызов функции входа привел к перенаправлению, а следующие данные были удалены по второму запросу. Если бы сохранить следующие данные между двумя запросами, все будет работать нормально. – jas

0

Используйте сеанс, чтобы следить за предыдущий URL, , например:

@app.route('/profile') 
def profile(): 
    if user_not_logged_in: 
     session['url'] = url_for('profile') 
     return redirect(url_for('login')) 
    return rendertemplate('profile.html') 

@app.route('/login') 
def login(): 
    if login == True: #assuming login was successful 
     if 'url' in session: 
      return redirect(session['url']) 
     return redirect(url_for('anyother_url')) 
Смежные вопросы