烧瓶/werkzeug,登录后如何返回上一页
题
我正在使用基于使用Python的Werkzeug的烧瓶微型框架。
在每个限制页面之前,都有一个装饰器来确保用户登录,如果未登录,目前将其返回登录页面,例如:
# 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)
有谁知道如何做到这一点?
感谢您的帮助 :-)
解决方案
我认为标准实践是在成功登录后,将用户重定向到登录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()
, ,因为我不知道这是如何在烧瓶中完成的。
然后,在您的登录处理程序中,当用户成功登录时,您检查是否有一个 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'])
只要您以“ wandurl”的形式以“ wandurl”的价值,这将自动重定向到成功注册的下载 qs
, ,或者您可以将您的表格提交给查询字符串;这可能只是模板中的一点点。
不隶属于 StackOverflow