代码之家  ›  专栏  ›  技术社区  ›  Jon Cox

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

  •  22
  • Jon Cox  · 技术社区  · 15 年前

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

    # 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\u文件?id=3)

    有人知道怎么做吗?

    感谢您的帮助:-)

    2 回复  |  直到 15 年前
        1
  •  25
  •   Will McCutchen    15 年前

    我认为标准的做法是将用户成功登录后需要重定向的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(通常是 / ,我猜)。

        2
  •  12
  •   Blubberguy22    10 年前

    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 /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'])
    

    如果您有一个名为“wantsurl”的表单,其值为 qs