web-dev-qa-db-fra.com

Comment suivre l'utilisateur actuel dans flask-login?

J'essaie d'utiliser l'utilisateur actuel à mon avis depuis flask-login. J'ai donc essayé de g object

J'assigne flask.ext.login.current_user à l'objet g

@pot.before_request
def load_users():
   g.user = current_user.username

Cela fonctionne si l'utilisateur a raison. Mais quand je le fais inscription ou connectez-vous avec des informations d'identification erronées, j'obtiens cette erreur

AttributeError: 'AnonymousUserMixin' object has no attribute 'username'

Veuillez m'éclairer où je me trompe ...

17
naga4ce

Merci pour votre réponse @Joe et @pjnola, comme vous l'avez tous suggéré, je me suis référé flask-login docs

J'ai trouvé que nous pouvons personnaliser la classe d'utilisateurs anonymes, j'ai donc personnalisé pour mes besoins,

Anonymous class

#!/usr/bin/python
#flask-login anonymous user class
from flask.ext.login import AnonymousUserMixin
class Anonymous(AnonymousUserMixin):
  def __init__(self):
    self.username = 'Guest'

Ensuite, j'ai ajouté cette classe à anonymous_user

login_manager.anonymous_user = Anonymous

À partir de cela, il a pu récupérer le nom d'utilisateur s'il s'agissait d'une demande anonyme.

16
naga4ce

Eh bien, le message d'erreur dit tout. Il n'y a aucun utilisateur connecté, donc current_user renvoie un AnonymousUserMixin. AnonymousUserMixin implémente l'interface décrite ici: http://flask-login.readthedocs.org/en/latest/#your-user-class (qui n'inclut pas de username propriété). Essayez quelque chose comme ceci:

@pot.before_request
def load_users():
    if current_user.is_authenticated():
        g.user = current_user.get_id() # return username in get_id()
    else:
        g.user = None # or 'some fake value', whatever

De toute évidence, le reste de votre code doit faire face à la possibilité que g.user ne fera pas référence à un utilisateur réel.

9
pjnola

AnonymousUserMixin n'a pas d'attribut de nom d'utilisateur. Vous devez écraser l'objet et appeler le mixin. Jetez un œil à LoginManager.anonymous_user qui est un objet utilisé quand aucun utilisateur n'est connecté.

Vous devez également obtenir l'utilisateur de quelque part. Il est inutile de stocker le nom d'utilisateur dans g car vous pouvez simplement utiliser current_user.username.

Si vous vouliez obtenir le nom d'utilisateur dont vous auriez besoin aussi

if current_user.is_authenticated():
    g.user = current_user.username

Cela nécessiterait que l'objet utilisateur possède une propriété appelée nom d'utilisateur. Il existe de nombreuses façons de personnaliser l'utilisation de Flask-Logins

Je suggère de relire les documents et de jeter un œil au code source:

https://github.com/maxcountryman/flask-login/blob/master/flask_login.py

Joe

5
Joe Doherty