2013-10-09 7 views
14

Sto cercando di utilizzare l'utente corrente nella mia vista da flask-login. Così ho cercato di g objectCome rintracciare l'utente corrente in flask-login?

I m assegnando flask.ext.login.current_user per g oggetto

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

Funziona se l'utente è corretto. Ma quando faccio iscrizione o login come con credenziali errate ottengo questo errore

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

Si prega di Enlight me dove sbaglio ...

risposta

14

Grazie per la risposta @ Joe e @pjnola, come tutti mi ha suggerito riferito flask-login docs

ho scoperto che siamo in grado di personalizzare la classe utente anonimo, così ho personalizzato per la mia esigenza,

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' 

poi aggiunti questa classe per anonymous_user

login_manager.anonymous_user = Anonymous

Da questo è stato in grado di recuperare il nome utente se era richiesta anonima.

+3

Si consiglia di ereditare l'oggetto anonimo da AnonymousUserMixin, anziché reimplementarlo da capo. In questo modo, se Flask-Login cambia la sua API, ottieni queste modifiche. Inoltre, 'get_id' dovrebbe essere un metodo che restituisce' None', non "None" stesso. –

+0

Vorrei andare con quello che dice Mark su questo: 'classe Anonymous (AnonymousUserMixin):' –

+0

Sure @MarkHildreth, sì, questo è il modo migliore di implementare, Grazie – naga4ce

5

AnonymousUserMixin non ha un attributo nome utente. È necessario sovrascrivere l'oggetto e chiamare il mixin. Date un'occhiata a LoginManager.anonymous_user, che è un oggetto che viene utilizzato quando nessun utente ha effettuato il login.

È inoltre necessario ottenere l'utente da qualche parte. Non ha senso archiviare il nome utente in g poiché potresti semplicemente usare current_user.username.

Se si voleva ottenere il nome utente avrebbe bisogno anche

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

Ciò richiederebbe che l'oggetto utente ha una proprietà chiamata nome utente. Ci sono un sacco di modi per personalizzare Flask-Login usare

suggerisco rileggendo i documenti e dare un'occhiata al codice sorgente:

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

Joe

+0

Nella versione più recente del login del contenitore, "is_authenticated" viene convertito in una variabile bool. Quindi la versione corretta è se current_user.is_authenticated: g_user = current_user.get_id() – Pradheep

6

Bene, il messaggio di errore dice tutto. Non vi è alcun utente registrato, quindi current_user restituisce un AnonymousUserMixin. AnonymousUserMixin implementa l'interfaccia qui descritta: http://flask-login.readthedocs.org/en/latest/#your-user-class (che non include una proprietà username). Provare qualcosa di simile:

@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 

Ovviamente, il resto del codice deve fare i conti con la possibilità che g.user non si riferiscono ad un utente reale.

Problemi correlati