2016-04-11 3 views
1

Я пытаюсь реализовать флажок-логин в своем приложении, в котором также используется фляжка-монгоингин. Вот мой пользователь прото:Flask-mongoengine document id

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) с моей точки зрения входа в систему, он вызывает get_id метод User, но self._id возвращает None. Я также попробовал self.id с тем же результатом. Затем я попытался добавить _id поле явно:

class User(db.Document, UserMixin): 
    _id = db.ObjectIdField(default=bson.ObjectId()) 

, но затем, self._id дает мне 'User u'username'> вместо идентификатора пользователя.

У вас есть представление о том, как восстановить _id пользователя?

+0

спасибо, но нет, нет атрибута не user_id :(Тем не менее, я нашел обходной путь используя pymongo ie user._get_collection() и запрос find_one. Я отправлю его ... – GuillaumeA

ответ

1

Я нашел обходное решение для этой проблемы. Мой прототип пользователя обновляется следующим образом, используя 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' 
1

Хотя я не знаю, если ответ на ваш вопрос по-прежнему необходима - вы нашли решение для Вас и ваш вопрос старый. Но если кто-то приходит я решил его с помощью следующего кода:

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 
Смежные вопросы