Baňka / Werkzeug, jak se vrátit předchozí stránku po přihlášení

hlasů
21

Já používám Baňka mikro-rámce, který je založen na Werkzeug, který používá Python.

Před každým omezeného straně je malíř, abyste zjistili, je uživatel přihlášen, v současné době jich návratu na přihlašovací stránku, pokud nejsou přihlášeni, tak jako:

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

Po přihlášení, je třeba se vrátit uživatele na stránku, která jim vzala na přihlašovací stránku. Je také potřeba udržet věci, jako je předaných proměnných (tj celý odkaz podstatě www.example.com/download_file?id=3)

Ví někdo, jak to udělat?

Děkuji za vaší pomoc :-)

Položena 10/09/2010 v 17:37
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
20

Myslím, že běžnou praxí je připojit URL, na kterou potřebuje uživatel přesměrován po úspěšném přihlášení ke konci QueryString přihlašovacím adresy URL.

Byste změnit svůj natěrač k něčemu takovému (s propouštěním ve vaší dekoratérka funkce také odebrány):

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

Budete muset střídat něco get_current_url(), protože já nevím, jak se to dělá v baňce.

Pak, v přihlašovací psovoda, když se uživatel úspěšně přihlásí, můžete zkontrolovat, jestli tam je nextparametr v žádosti, a pokud ano, je přesměrování na tuto adresu URL. V opačném případě je přesměrovat do určité výchozí URL (obvykle /, myslím).

Odpovězeno 10/09/2010 v 17:48
zdroj uživatelem

hlasů
11

Dalo by se použít řetězec dotazu držet informace o souboru neporušená po kliknutí nebo dva. Jedním z pěkných věcí url_forje, jak to projde neznámé parametry jako řetězce dotazu . Takže aniž by se změnila svůj registrační stránka moc byste mohli udělat něco takového:

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

Zde wantsurlbude sledovat url uživatel padnout. Pokud je neregistrovaný uživatel přejde /download/some/file.txt, login_requiredpošle vás /register?wantsurl=%2Fdownload%2Fsome%2Ffile.txt Poté přidejte několik řádků k registrační funkci:

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

To by se automaticky přesměruje na stažení na úspěšné registraci, za předpokladu, že máte něco ve formě zvané ‚wantsurl‘ s hodnotou qs, nebo byste mohli mít svůj odeslání formuláře s řetězci dotazu; který by mohl být jen trochu if-else v šabloně.

Odpovězeno 11/09/2010 v 05:57
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more