1. ホーム
  2. python

TypeError: 'bool' オブジェクトは呼び出し可能ではありません。

2022-02-18 10:30:12

今日、flaskの学習中にTypeError: 'bool' object is not callableエラーになりました。後で注意できるように、ここに記録しておきます。

Webで見つけた2つの原因。

1、バージョンバグの原因を考える。[http://blog.csdn.net/thone00/article/details/78194307]

2、is_authenticated はメソッドではなくプロパティです。[http://bbs.csdn.net/topics/391875382]



その理由は、ユーザーモデルはオブジェクトを継承して定義し、is_authenticated, is_active, is_anonymous などの必須属性をカスタマイズし、カスタマイズする際にデコレータを使用しないためです。

カスタムコード

# With flask-login you must implement four fixed methods
# Or just have the user model inherit from the UserMixin class and implement the following four methods by default
def is_authenticated(self):
    """Must return TRUE if the user is logged in"""
    return True

def is_active(self):
    """MUST return TRUE if the sequential user is logged in"""
    return True

def is_anonymous(self):
    """MUST return False for regular users""""
    return False

def get_id(self):
    """ must return a unique representation of the user, using the Unicode encoded string """
    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' オブジェクトは呼び出し可能ではありません。

<未定義


Home page display - >
class="page-header">
    


Use the if statement in the template to show the user name if the user is logged in, otherwise show this is the homepage - >
    {% if current_user.is_authenticated() %}
        Hello , {


{ current_user.username }} !
    {% else %}
       Welcome , main Index !!!
    {% endif %}
    






<未定義 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() <未定義 # Or have the user model inherit directly from the UserMixin class, implementing the following four methods by default and using decorations to reach them as properties in the source code @property def is_authenticated(self): """Must return TRUE if the user is logged in""" return True @property def is_active(self): """MUST return TRUE if the sequential user is logged in"""" return True @property def is_anonymous(self): """MUST return False for regular users""" return False

その理由は、以下のように @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()

````

#出力

トレースバック (最も最近の呼び出し):
a
  ファイル "D:/Workspace/python/exmple/model_exmples/tmp.py", 行 24, in <module>
b
    a.print_a()
a
TypeError: 'NoneType' オブジェクトは呼び出し可能ではありません。


解決策 カスタムモデルをデコレータ付きのソースとして追加し、それを属性で呼び出します。

# Or have the user model inherit directly from the UserMixin class, implementing the following four methods by default and using decorations to reach them as properties in the source code
@property
def is_authenticated(self):
    """Must return TRUE if the user is logged in"""
    return True

@property
def is_active(self):
    """MUST return TRUE if the sequential user is logged in""""
    return True

@property
def is_anonymous(self):
    """MUST return False for regular users"""
    return False