2016-07-14 9 views
0

私はFlask-MongoengineとFlask-Loginを使用してアプリケーションの認可をコードしようとしています。Mongoengine AttributeError

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:そして、私はこの奇妙なエラーを取得しています、私はクラスをsupering試した

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

+0

であるあなたは、この上の任意の更新または修正を持っていますか? – Tronic

答えて

0

この問題に対する修正は、あなたが__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 __init__(self, email, first_name, last_name, password, *args, **kwargs): 
     super(db.Document, 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 
0

Mongoengineのようにスーパークラスのコンストラクタを呼び出す必要があるということです。

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 protected]', first_name='hello', last_name='there', password=2342143213) 
user.save() 
print(user.id)