Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Mongoengine属性错误_Python_Flask_Mongoengine_Flask Mongoengine - Fatal编程技术网

Python Mongoengine属性错误

Python Mongoengine属性错误,python,flask,mongoengine,flask-mongoengine,Python,Flask,Mongoengine,Flask Mongoengine,我正在尝试使用Flask Mongoengine和Flask登录为应用程序编写授权代码。我得到了一个奇怪的错误: File "/usr/lib/python3.5/site-packages/mongoengine/base/document.py", line 188, in __setattr__ super(BaseDocument, self).__setattr__(name, value) File "/usr/lib/python3.5/site-packages/mo

我正在尝试使用Flask Mongoengine和Flask登录为应用程序编写授权代码。我得到了一个奇怪的错误:

File "/usr/lib/python3.5/site-packages/mongoengine/base/document.py", line 188, in __setattr__
    super(BaseDocument, self).__setattr__(name, value)
  File "/usr/lib/python3.5/site-packages/mongoengine/base/fields.py", line 132, in __set__
    if instance._initialised:
AttributeError: _initialised
My models.py:

from app import app, db
from flask.ext.login import LoginManager


login_manager = LoginManager()
login_manager.init_app(app)


class User(db.Document):
    email = db.StringField(required=True)
    first_name = db.StringField(max_lenght=40, required=True)
    last_name = db.StringField(max_lenght=40, required=True)
    password = db.StringField(required=True)

    def __init__(self, email, first_name, last_name, password):
        self.email = email
        self.first_name = first_name
        self.last_name = last_name
        self.password = password

    def is_authenticated(self):
        return True

    def is_active(self):
        return True

    def is_anonymous(self):
        return False

   def get_id(self):
        return self.email
我试着超越全班,但没用


解决这个问题的办法是,您需要像这样调用超类的构造函数

class User(db.Document):
    email = db.StringField(required=True)
    first_name = db.StringField(max_lenght=40, required=True)
    last_name = db.StringField(max_lenght=40, required=True)
    password = db.StringField(required=True)

    def __init__(self, email, first_name, last_name, password, *args, **kwargs):
        super(User, self).__init__(*args, **kwargs)
        self.email = email
        self.first_name = first_name
        self.last_name = last_name
        self.password = password

    def is_authenticated(self):
        return True

    def is_active(self):
        return True

    def is_anonymous(self):
        return False

   def get_id(self):
        return self.email

解决这个问题的办法是,您需要像这样调用超类的构造函数

class User(db.Document):
    email = db.StringField(required=True)
    first_name = db.StringField(max_lenght=40, required=True)
    last_name = db.StringField(max_lenght=40, required=True)
    password = db.StringField(required=True)

    def __init__(self, email, first_name, last_name, password, *args, **kwargs):
        super(User, self).__init__(*args, **kwargs)
        self.email = email
        self.first_name = first_name
        self.last_name = last_name
        self.password = password

    def is_authenticated(self):
        return True

    def is_active(self):
        return True

    def is_anonymous(self):
        return False

   def get_id(self):
        return self.email

Mongoengine不需要您定义一个uu init

class User(db.Document):
    email = db.StringField(required=True)
    first_name = db.StringField(max_lenght=40, required=True)
    last_name = db.StringField(max_lenght=40, required=True)
    password = db.StringField(required=True)

    def clean(self):
        # clean will be called when you call .save()
        # You can do whatever you'd like to clean data before save
        self.password = str(self.password)
那么你所要做的就是

user = User(email='email@gmail', first_name='hello', last_name='there', password=2342143213)
user.save()
print(user.id)

Mongoengine不需要您定义一个uu init

class User(db.Document):
    email = db.StringField(required=True)
    first_name = db.StringField(max_lenght=40, required=True)
    last_name = db.StringField(max_lenght=40, required=True)
    password = db.StringField(required=True)

    def clean(self):
        # clean will be called when you call .save()
        # You can do whatever you'd like to clean data before save
        self.password = str(self.password)
那么你所要做的就是

user = User(email='email@gmail', first_name='hello', last_name='there', password=2342143213)
user.save()
print(user.id)

未来的读者应该知道,clean在每次保存调用之前都会被调用,因此如果它用于散列模型中的密码字段,例如:

def clean(self):
    self.password = bcrypt.generate_password_hash(self.password).decode('utf-8')
密码将不断被覆盖,这是不需要的。解决方法是使用一个附加字段,例如:password_hashed=db.BooleanFielddefault=False


未来的读者应该知道,clean在每次保存调用之前都会被调用,因此如果它用于散列模型中的密码字段,例如:

def clean(self):
    self.password = bcrypt.generate_password_hash(self.password).decode('utf-8')
密码将不断被覆盖,这是不需要的。解决方法是使用一个附加字段,例如:password_hashed=db.BooleanFielddefault=False


您对此有任何更新或修复吗?您对此有任何更新或修复吗?