Pregunta

estoy usando el micro-marco Flask que se basa en Werkzeug, que utiliza Python.

Antes de cada página restringida existe un decorador para asegurar que el usuario ha iniciado sesión, actualmente devolviéndolos a la página de inicio de sesión si no se registran en, así:

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

Después de iniciar sesión, es necesario que los usuarios volver a la página que les llevó a la página de inicio de sesión. También necesita mantener las cosas como las variables pasadas (es decir, el enlace completo básicamente www.example.com/download_file?id=3)

¿Alguien sabe cómo hacer esto?

Gracias por su ayuda: -)

¿Fue útil?

Solución

Creo que la práctica habitual es añadir la URL a la que el usuario necesita para ser redirigido después de una conexión exitosa hasta el final de la cadena de consulta de la URL de inicio de sesión.

cambiaría su decorador a algo como esto (con redundancias en su función decoradora también eliminado):

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

tendrá que sustituir algo para get_current_url(), porque no sé cómo se hace en el frasco.

A continuación, en el controlador de inicio de sesión, cuando el usuario inicia una sesión con éxito en, comprobar para ver si hay un parámetro next en la solicitud y, si es así, que los redirija a esa URL. De lo contrario, los redirija a cierta URL por defecto (normalmente /, supongo).

Otros consejos

Se podría usar una cadena de consulta para mantener la información de archivo intacto durante un clic o dos. Una de las buenas cosas de url_for es cómo pasa los parámetros desconocidos como cadenas de consulta . Así, sin cambiar su página de registro demasiado usted podría hacer algo como esto:

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

Aquí wantsurl va a llevar un registro de la URL al usuario aterrizó en. Si un usuario no registrado va a /download/some/file.txt, login_required le enviará a /register?wantsurl=%2Fdownload%2Fsome%2Ffile.txt Luego se agrega un par de líneas a su función de registro:

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

Eso sería redirigir automáticamente a la descarga en el registro con éxito, siempre y cuando tenga algo en la forma llamada 'wantsurl' con el valor de qs, ya que podría tener su forma presente con una cadena de consulta; que podría ser sólo un poco si-else en la plantilla.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top