Flask/Werkzeug,登录后如何返回上一页

2024-04-25 04:14:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是基于Werkzeug的Flask微框架,它使用Python。

在每个受限页面之前,都有一个decorator来确保用户登录,如果用户没有登录,则当前会将其返回到登录页面,如下所示:

# 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)

有人知道怎么做吗?

谢谢你的帮助:-)


Tags: 用户inforreturnifdownloaddefargs
2条回答

您可以使用一个查询字符串在单击一两次之后保持文件信息的完整性。关于url_for的一个好处是它如何passes unknown parameters as query strings。所以,在不改变你的注册页面太多的情况下,你可以这样做:

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.txtlogin_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'])

如果您的表单名为“wantsurl”,值为qs,或者您可以使用查询字符串提交表单,那么在成功注册时,这将自动重定向到下载;如果模板中有其他内容,则可能会有一点。

我认为标准做法是将用户成功登录后需要重定向的URL附加到登录URL的querystring的末尾。

您可以将decorator更改为类似这样的内容(还可以删除decorator函数中的冗余):

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(我猜通常是/)。

相关问题 更多 >