Frage

Ich bin mit dem Flask Mikro-Framework, das auf Werkzeug basiert, der Python verwendet.

Vor jeder eingeschränkten Seite gibt es einen Dekorateur der Benutzer, um sicherzustellen, angemeldet ist, zur Zeit sie auf die Anmeldeseite zurückkehren, wenn sie nicht eingeloggt sind, etwa so:

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

Nach der Anmeldung muss es Benutzern zu der Seite zurückzukehren, die sie auf der Login-Seite nahm. Es muss auch Dinge behalten, wie die übergebenen Variablen (das heißt die gesamte Verbindung grundsätzlich www.example.com/download_file?id=3)

Wer weiß, wie dies zu tun?

Vielen Dank für Ihre Hilfe: -)

War es hilfreich?

Lösung

ich glaube, gängige Praxis ist die URL anhängen, an die die Bedürfnisse der Nutzer nach einer erfolgreichen Anmeldung bis zum Ende der Abfragezeichenfolgeflag-Login-URL weitergeleitet werden.

Sie würden Ihren Dekorateur zu so etwas wie dies ändern (mit Redundanzen in Ihrer Dekorateur Funktion auch entfernt):

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

Sie werden für get_current_url() auf Ersatz etwas haben, denn ich weiß nicht, wie das in der Flasche getan hat.

Dann in Ihren Login-Handler, wenn der Benutzer erfolgreich anmeldet, überprüfen Sie, um zu sehen, ob es ein next Parameter ist in der Anfrage, und wenn ja, können Sie sie zu dieser URL umleiten. Andernfalls leiten Sie sie zu einem gewissen Standard-URL (in der Regel /, glaube ich).

Andere Tipps

Sie können eine Abfrage-Zeichenfolge verwenden, um die Datei-Info intakt über einen oder zwei Klicks zu halten. Eines der schönen Dinge über url_for ist, wie es geht unbekannte Parameter als Query-Strings . So können ohne Ihre Registrierungsseite zu viel zu ändern, die Sie so etwas tun könnte:

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

Hier wantsurl wird der Überblick über die URL hält die Benutzer landeten auf. Wenn ein nicht registrierter Benutzer /download/some/file.txt geht, login_required senden Sie /register?wantsurl=%2Fdownload%2Fsome%2Ffile.txt Dann fügen Sie ein paar Zeilen zu Ihrer Registrierungsfunktion:

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

Das würde automatisch zum Download auf erfolgreiche Registrierung umleiten, sofern Sie etwas in Form namens ‚wantsurl‘ mit dem Wert von qs, oder Sie können Ihr Formular mit einer Abfragezeichenfolge einreichen; Das könnte nur ein wenig if-else in der Vorlage sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top