今天在学习 flask时出现 TypeError: 'bool' object is not callable 报错。在这记录一下,以便以后注意。
在网上找到两个原因:
1、认为版本bug导致:[http://blog.csdn.net/thone00/article/details/78194307]
2、is_authenticated是属性而不是方法,把括号去掉就可以了:[http://bbs.csdn.net/topics/391875382]
产生原因是:在定义用户模型时继承 object,自定义了is_authenticated、is_active、is_anonymous等必须属性,自定义时没有使用装饰器.
自定义代码
# 使用 flask-login 必须实现固定四个方法 # 或者直接让用户模型继承 UserMixin类,默认实现下面四个方法 def is_authenticated(self): """如果用户已经登录必须返回 TRUE""" return True def is_active(self): """如果循序用户登录,必须返回 TRUE""" return True def is_anonymous(self): """对普通用户必须返回 False""" return False def get_id(self): """必须返回用户的唯一表示符,使用 Unicode 编码字符串""" return self.id
源码
@property def is_active(self): return True @property def is_authenticated(self): return True @property def is_anonymous(self): return False def get_id(self): try: return text_type(self.id) except AttributeError: raise NotImplementedError('No `id` attribute - override `get_id`')
在定义管理员模型继承 flask-login.AnonymousUserMixin ,但在使用时直接当做一般的方法使用,一般用户登录时正常,管理员用户登录时,报错 TypeError: 'bool' object is not callable。
class="page-header">{% if current_user.is_authenticated() %} Hello , {{ current_user.username }} ! {% else %} Welcome , main Index !!! {% endif %}
原因是使用@property装饰器的方法,不能按一般方法调用如下
class A(object): name='sdfs' @property def print_a(self): print('a') def print_b(self): print('b') a = A() a.print_a a.print_b() a.print_a()```
#输出
Traceback (most recent call last):
a
File "D:/Workspace/python/exmple/model_exmples/tmp.py", line 24, in
b
a.print_a()
a
TypeError: 'NoneType' object is not callable
```
解决方法:将自定义模型按源码的方式加上装饰器,并在调用是按属性调用即可
# 或者直接让用户模型继承 UserMixin类,默认实现下面四个方法,在源码中使用装饰达到作为属性使用 @property def is_authenticated(self): """如果用户已经登录必须返回 TRUE""" return True @property def is_active(self): """如果循序用户登录,必须返回 TRUE""" return True @property def is_anonymous(self): """对普通用户必须返回 False""" return False