Domanda

Sto usando la micro-quadro Flask che si basa su Werkzeug, che utilizza Python.

Prima di ogni pagina ristretto c'è un decoratore per garantire l'utente è connesso, attualmente li tornando alla pagina di login, se non sono connessi, in questo modo:

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

Dopo il login, si deve restituire gli utenti alla pagina che li ha portati alla pagina di login. Inoltre deve mantenere cose come le variabili passate (cioè l'intero link fondamentalmente www.example.com/download_file?id=3)

Qualcuno sa come fare questo?

Grazie per il vostro aiuto: -)

È stato utile?

Soluzione

Credo che la pratica standard è di aggiungere l'URL a cui le esigenze degli utenti per essere reindirizzati dopo un login riuscito alla fine della querystring dell'URL di login.

Si avrebbe cambiato il vostro decoratore a qualcosa di simile (con licenziamenti nella funzione decoratore anche rimosso):

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

Si dovrà sostituire qualcosa per get_current_url(), perché io non so come questo è fatto nel pallone.

Poi, nel vostro gestore di login, quando l'utente accede con successo, si controlla per vedere se c'è un parametro next nella richiesta e, in caso affermativo, vengono reindirizzati a tale URL. In caso contrario, vengono reindirizzati ad alcuni URL predefinito (di solito /, immagino).

Altri suggerimenti

Si potrebbe utilizzare una stringa di query per mantenere il file di informazioni intatta nel uno o due clic. Una delle cose belle di url_for è come passa i parametri sconosciuti come stringhe di query . Quindi, senza cambiare la pagina di registrazione troppo, si potrebbe fare qualcosa di simile:

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

Qui wantsurl mancherà di tenere traccia del URL dell'utente atterrato su. Se un utente non registrato va a /download/some/file.txt, login_required ti invierà a /register?wantsurl=%2Fdownload%2Fsome%2Ffile.txt Poi si aggiunge un paio di righe alla funzione di registrazione:

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

che avrebbe reindirizzare automaticamente al download sulla registrazione di successo, a patto di avere qualcosa nella forma chiamata 'wantsurl' con il valore di qs, o si potrebbe avere il modulo di presentare con una stringa di query; che potrebbe essere solo un po 'if-else nel modello.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top