首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mongoengine AttributeError

Mongoengine AttributeError
EN

Stack Overflow用户
提问于 2016-07-14 08:27:21
回答 4查看 1.6K关注 0票数 2

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

代码语言:javascript
复制
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

我的models.py:

代码语言:javascript
复制
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

我试着提高这门课的成绩,但没用。

https://github.com/MongoEngine/flask-mongoengine/issues/156

EN

回答 4

Stack Overflow用户

发布于 2016-10-29 06:12:32

Mongoengine不需要你定义一个__init__。

代码语言:javascript
复制
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)

那么你所要做的就是

代码语言:javascript
复制
user = User(email='email@gmail', first_name='hello', last_name='there', password=2342143213)
user.save()
print(user.id)
票数 5
EN

Stack Overflow用户

发布于 2016-08-06 22:40:02

这个问题的修复方法是,您需要像这样调用超类的构造函数

代码语言:javascript
复制
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
票数 3
EN

Stack Overflow用户

发布于 2018-03-20 15:53:52

未来的读者应该比在knittledan answer中更清楚,clean()是在每次 save()调用之前调用的,所以如果它被用来散列模型中的密码字段,例如:

代码语言:javascript
复制
def clean(self):
    self.password = bcrypt.generate_password_hash(self.password).decode('utf-8')

密码将不断被覆盖,这不是我们所希望的。一种解决方法是使用附加字段,例如:password_hashed = db.BooleanField(default=False)

代码语言:javascript
复制
def clean(self):
    if not self.password_hashed:
        self.password        = bcrypt.generate_password_hash(self.password).decode('utf-8')
        self.password_hashed = True
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38363726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档