2013-10-23 17 views
10

Sto lavorando attraverso il Flask Mega-tutorial in questo momento e ho incontrato questo pezzo di codice:Qual è il punto del metodo "is_authenticated" utilizzato in Flask-Login?

class User(db.Model): 
    id = db.Column(db.Integer, primary_key = True) 
    nickname = db.Column(db.String(64), unique = True) 
    email = db.Column(db.String(120), unique = True) 
    role = db.Column(db.SmallInteger, default = ROLE_USER) 
    posts = db.relationship('Post', backref = 'author', lazy = 'dynamic') 

    def is_authenticated(self): 
     return True 

    def is_active(self): 
     return True 

    def is_anonymous(self): 
     return False 

    def get_id(self): 
     return unicode(self.id) 

    def __repr__(self): 
     return '<User %r>' % (self.nickname) 

is_authenticated, is_active, e is_anonymous sembrano abbastanza strano per me - quando avrebbero mai tornare nulla diverso dal loro valore predefinito?

Qualcuno potrebbe spiegarmi perché Flask-Login mi fa usare questi metodi apparentemente inutili?

risposta

27

Prima di tutto, is_anonymous() e is_authenticated() sono l'opposto dell'altro. Potresti definirne uno come negazione dell'altro, se vuoi.

è possibile utilizzare questi due metodi per determinare se un utente è connesso.

quando nessuno è connesso in Flask-Accesso di current_user è impostato su un oggetto AnonymousUser. Questo oggetto risponde a is_authenticated() e is_active() con False e a is_anonymous() con True.

Il metodo is_active() ha un altro importante utilizzo. Invece di restituire sempre True come ho proposto nel tutorial, è possibile farlo restituire False per utenti bannati o disattivati ​​e quegli utenti non potranno accedere.

+0

Grazie Miguel, ha senso. Non mi ero reso conto che current_user potrebbe restituire un utente anonimo o un oggetto utente. Non vedo l'ora di avere il libro quando uscirà. – user1787531

+0

Questo non ha effetto sulla risposta, ma nelle attuali versioni di Flask-Login, questi tre metodi ora sono invece proprietà. – davidism

4

Sono rimasto sconcertato da questo is_authenticated vs is_anonymous per ore. Non potevo credere che fossero solo opposti. Finalmente per caso ho trovato this old blog post. Si tratta di un problema nel sistema di template di Django in cui le variabili non esistenti valutano False. Ciò potrebbe causare un comportamento errato durante il test is_anonymous nel codice del modello. Ancora una volta è vecchio quindi non so se regge. Il modo in cui hanno risolto il problema era creare is_authenticated.

Immagino che Flask-Login abbia appena copiato il modello da Django senza fare domande. Ora posso dormire in pace.

Problemi correlati