Question

J'utilise le micro-cadre Flask qui est basé sur Werkzeug, qui utilise Python.

Avant chaque page il y a un restreint décorateur pour assurer que l'utilisateur est connecté, les retourner actuellement la page de connexion si elles ne sont pas connectés, comme suit:

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

Une fois connecté, il doit revenir aux utilisateurs de la page qui les a emmenés à la page de connexion. Il doit également conserver des choses telles que les variables passées (à savoir le lien entier essentiellement de www.example.com/download_file?id=3)

Quelqu'un sait comment faire cela?

Merci pour votre aide: -)

Était-ce utile?

La solution

Je pense que la pratique courante consiste à ajouter l'URL à laquelle les besoins des utilisateurs soient redirigés après une connexion réussie à la fin de la chaîne de requête de l'URL de connexion.

Vous changerait votre décorateur à quelque chose comme ça (avec des licenciements dans votre fonction décorateur également supprimé):

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

Vous aurez quelque chose de substitut à get_current_url(), parce que je ne sais pas comment cela se fait dans Flask.

Ensuite, dans votre gestionnaire de connexion, lorsque l'utilisateur se connecte avec succès, vous vérifiez s'il y a un paramètre next dans la demande et, le cas échéant, vous les rediriger vers cette URL. Dans le cas contraire, vous les rediriger vers une URL par défaut (généralement /, je suppose).

Autres conseils

Vous pouvez utiliser une chaîne de requête pour conserver les informations de fichier intact sur un clic ou deux. Une des belles choses sur la façon dont il est url_for passe des paramètres inconnus comme des chaînes de requête . Donc, sans changer votre page d'inscription trop, vous pourriez faire quelque chose comme ceci:

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

Ici wantsurl gardera la trace de l'URL que l'utilisateur a atterri sur. Si un utilisateur non enregistré va à /download/some/file.txt, login_required vous envoyer à /register?wantsurl=%2Fdownload%2Fsome%2Ffile.txt Ensuite, vous ajoutez quelques lignes à votre fonction d'enregistrement:

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

qui redirigera automatiquement vers le téléchargement sur l'enregistrement avec succès, à condition que vous avez quelque chose sous la forme appelée « wantsurl » avec la valeur de qs, ou vous pourriez avoir votre formulaire présente avec une chaîne de requête; qui pourrait juste être un peu si-else dans le modèle.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top