web-dev-qa-db-fra.com

flask avant la demande - ajouter une exception pour un itinéraire spécifique

Dans la fonction before_request() (ci-dessous), je souhaite rediriger l'utilisateur vers /login s'ils ne sont pas encore connectés. Existe-t-il une variable spéciale qui me donnera l'URL actuelle qui fonctionnera comme l'exemple ci-dessous?

@app.before_request
def before_request():
    # the variable current_url does not exist
    # but i want something that works like it
    if (not 'logged_in' in session) and (current_url != '/login'):
        return redirect(url_for('login'))

Je dois vérifier que l'URL actuelle est /login, parce que si je ne le fais pas, le serveur entre dans une boucle infinie.

37
SeanPlusPlus

Il y a quelques propriétés sur l'objet de requête que vous pouvez vérifier, documentées ici , request.path est probablement ce que vous voulez. Puis-je suggérer request.endpoint cependant, vous serez donc couvert si vous décidez de router votre vue vers une autre URL ou plusieurs URL

@app.before_request
def before_request():
    if 'logged_in' not in session and request.endpoint != 'login':
        return redirect(url_for('login'))
65
DazWorrall

Vous pouvez utiliser un décorateur. Voici un exemple qui montre comment vérifier une clé API avant des demandes spécifiques:

from functools import wraps

def require_api_key(api_method):
    @wraps(api_method)

    def check_api_key(*args, **kwargs):
        apikey = request.headers.get('ApiKey')
        if apikey and apikey == SECRET_KEY:
            return api_method(*args, **kwargs)
        else:
            abort(401)

    return check_api_key

Et vous pouvez l'utiliser avec:

@require_api_key
13
savepopulation

Voici une implémentation de la réponse acceptée avec flask-login :

@app.before_request
def require_authorization():
    from flask import request
    from flask.ext.login import current_user

    if not (current_user.is_authenticated or request.endpoint == 'login'):
        return login_manager.unauthorized()
5
Ryne Everett