2015-09-23 15 views
7

Desidero modificare is_active in Flask-Login in modo che gli utenti non siano sempre attivi.Flask-Login solleva TypeError: l'oggetto 'bool' non è richiamabile quando si prova a sovrascrivere la proprietà is_active

L'impostazione predefinita restituisce sempre True, ma l'ho modificata per restituire il valore della colonna banned.

In base ai documenti, is_active deve essere una proprietà. Tuttavia, il codice Flask Login interno solleva:

TypeError: 'bool' object is not callable 

Quando si tenta di utilizzare is_active.

Come utilizzare correttamente is_active per disattivare alcuni utenti?

class User(UserMixin, db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    banned = db.Column(db.Boolean, default=False) 

    @property 
    def is_active(self): 
     return self.banned 

login_user(user, form.remember_me.data) 

if not force and not user.is_active(): 
TypeError: 'bool' object is not callable 
+0

@davidism, ora, dopo l'aggiornamento, ho un problema migliore https://github.com/miguelgrinberg/flasky/issues/1#issuecomment-142647023 lol – anvd

+0

Non sono sicuro di cosa intendi. Se un'applicazione si aspetta Flask-Login <0.3, quindi installa Flask-Login <0.3 e usalo in modo appropriato, fino a quando l'app non viene aggiornata. La mia risposta ha risposto alla tua domanda immediata? – davidism

+0

Questo bug relativo alla protezione avanzata della sessione è già stato segnalato a Flask-Login. Non è correlato alla modifica a 'is_active'. Ma non c'è risposta a "c'è un bug in Flask-Login" eccetto "attendere fino a quando non viene corretto". – davidism

risposta

20

is_active, is_anonymous e is_authenticated sono tutte proprietà a partire da Flask-Login 0.3. Se vuoi usarli, trattali come attributi, non chiamarli. Se si desidera ignorarli, ricordarsi di decorarli con @property.

# change from 
current_user.is_authenticated() 
# to 
current_user.is_authenticated 

Sembra che stai leggendo i documenti per la versione più recente (0.3), ma utilizzando una versione precedente della libreria. Versione 0.3 contains a breaking change che ha cambiato questi attributi dai metodi alle proprietà. Devi aggiornare alla versione più recente di Flask-Login e trattarli come proprietà.

Si disattiva l'utente provocando la proprietà is_active per restituire False. La tua idea di restituire il valore di una colonna va bene.

0

sovraccaricate is_active per implementare la propria logica.

Cosa c'è di sbagliato in questo? Niente IMO. È corretto, tranne che hai dimenticato di renderlo una proprietà usando @property decoratore

In Tornado è simile a current_user per esempio.

+0

ok, ma posso usare def is_banned (self): o qualsiasi altra cosa. fondamentalmente questa è una proprietà totalmente indipendente da flask_login, giusto? – anvd

+0

Sì, ma in questo caso is_active sarà sempre true. Dipende tutto dalla tua decisione –

Problemi correlati