Flask / Werkzeug, как вернуть предыдущую страницу после входа в систему

Я использую микроархитектуру Flask, которая основана на Werkzeug, которая использует Python.

Перед каждой ограниченной страницей есть декоратор, чтобы гарантировать, что пользователь вошел в систему, в настоящее время возвращает их на страницу входа в систему, если они не вошли в систему, например:

# Decorator def logged_in(f): @wraps(f) def decorated_function(*args, **kwargs): try: if not session['logged_in']: flash('Please log in first...', 'error') return redirect(url_for('login')) else: return f(*args, **kwargs) except KeyError: flash('Please log in first...', 'error') return redirect(url_for('login')) return decorated_function # Login function @app.route('/', methods=['GET', 'POST']) def login(): """Login page.""" if request.method=='POST': ### Checks database, etc. ### return render_template('login.jinja2') # Example 'restricted' page @app.route('/download_file') @logged_in def download_file(): """Function used to send files for download to user.""" fileid = request.args.get('id', 0) ### ... ### 

После входа в систему ему необходимо вернуть пользователей на страницу, которая привела их на страницу входа. Он также должен сохранять такие вещи, как переданные переменные (т. Е. Всю ссылку в основном www.example.com/download_file?id=3)

Кто-нибудь знает как это сделать?

Спасибо за помощь 🙂

2 Solutions collect form web for “Flask / Werkzeug, как вернуть предыдущую страницу после входа в систему”

Я считаю, что стандартная практика заключается в том, чтобы добавить URL-адрес, к которому пользователь должен быть перенаправлен после успешного входа в систему до конца запроса пользователя в URL-адресе.

Вы бы изменили свой декоратор на что-то вроде этого (с избыточностью в вашей функции декоратора также удалены):

 def logged_in(f): @wraps(f) def decorated_function(*args, **kwargs): if session.get('logged_in') is not None: return f(*args, **kwargs) else: flash('Please log in first...', 'error') next_url = get_current_url() # However you do this in Flask login_url = '%s?next=%s' % (url_for('login'), next_url) return redirect(login_url) return decorated_function 

Вы должны заменить что-то для get_current_url() , потому что я не знаю, как это делается в Flask.

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

Вы можете использовать строку запроса, чтобы сохранить информацию о файле без изменений одним кликом или двумя. Одна из приятных вещей о url_for заключается в том, как она передает неизвестные параметры в виде строк запроса . Поэтому, не меняя страницу регистрации слишком много, вы можете сделать что-то вроде этого:

 def login_required(f): @wraps(f) def decorated_function(*args, **kwargs): if g.user is None: return redirect(url_for('register', wantsurl = request.path)) return f(*args, **kwargs) return decorated_function 

Здесь wantsurl будет отслеживать URL, на который пользователь приземлился. Если незарегистрированный пользователь переходит в /download/some/file.txt , login_required отправит вас в /register?wantsurl=%2Fdownload%2Fsome%2Ffile.txt Затем вы добавите пару строк в свою регистрационную функцию:

 @app.route('/register', methods=['GET', 'POST']) def register(): if request.method == 'GET': if 'wantsurl' in request.args: qs = request.args['wantsurl'] return render_template('register.html', wantsurl=qs) if request.method == 'POST': if 'wantsurl' in request.form and everything_else_ok: return redirect(request.form['wantsurl']) 

Это автоматически перенаправит загрузку при успешной регистрации, если у вас есть что-то в форме «wanturl» со ​​значением qs или вы можете отправить свою форму с помощью строки запроса; это может быть немного, если-еще в шаблоне.

Python - лучший язык программирования в мире.