[英]Flask-mongoengine document id
我正在嘗試在也使用flask-mongoengine的應用程序中實現flask-login。 這是我的用戶原型:
class User(db.Document, UserMixin):
username = db.StringField(max_length=80)
email = db.StringField(max_length=255, unique=True)
password = db.StringField(max_length=255, required=True)
active = db.BooleanField(default=True)
def __init__(self, *args, **kwargs):
super(db.Document, self).__init__(self)
try:
self.username = kwargs['username']
self.email = kwargs['email']
self.password = kwargs['password']
except:
flash('Bad arguments for User')
@staticmethod
def salt_password(password):
return generate_password_hash(password)
@property
def is_authenticated(self):
return True
@property
def is_active(self):
return self.active
@property
def is_anonymous(self):
return False
def get_id(self):
return unicode(self._id)
def __repr__(self):
return '<User %r>' % (self.username)
def check_pwd(self, password):
return check_password_hash(self.password, password)
但是,當我從登錄視圖調用login_user(user)
函數時,它將調用User
的get_id
方法,但self._id
返回None
。 我也嘗試了self.id
,結果相同。 然后,我嘗試顯式添加_id
字段:
class User(db.Document, UserMixin):
_id = db.ObjectIdField(default=bson.ObjectId())
但是, self._id
給了我'User u'username'>
而不是用戶ID。
關於如何檢索用戶的_id
的任何想法?
我找到了解決此問題的方法。 我的用戶原型使用pymongo更新如下:
def get_id(self):
user_queried = self._get_collection().find_one({'username':self.username, 'email':self.email, 'password':self.password})
if user_queried is not None:
return unicode(user_queried['_id'])
else:
return 'None'
盡管我不知道是否仍然需要解決您的問題的方法-您為您找到了解決方案,而您的問題仍然很老。 但是,如果有人過來,我用以下代碼解決了它:
from mongoengine import Document, StringField, FloatField, BooleanField
class User(Document):
name = StringField(primary_key=True, required=True, max_length=50)
mail = StringField(required=True, max_length=255)
password = StringField(required=True, max_length=80)
first_name = StringField(max_length=255)
second_name = StringField(max_length=255)
authenticated = True # BooleanField(required=True, default=True)
is_active = True # BooleanField(required=True, default=True)
meta = {'db_alias': 'users'}
@property
def is_authenticated(self):
return True
@property
def is_active(self):
return True
@property
def is_anonymous(self):
return False
def get_id(self):
return self.name
並添加了以下user_loader
@login_manager.user_loader
def load_user(user_id):
user = User.objects(name=user_id)[0]
return user
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.