Как получить имена пользователей с моделью пользователя webapp2? - PullRequest
3 голосов
/ 23 декабря 2011

Я успешно с webapp2 могу аутентифицировать и входить / выходить из системы, и у меня есть декоратор, чтобы знать, вошел ли пользователь в систему, и это работает:

class MyPageHandler(NewBaseHandler):
    """
    Only accessible to users that are logged in
    """
    @user_required
    def get(self):
        user = self.auth.get_user_by_session()
        self.render_template('mypage.htm', {'user': self.auth.get_user_by_session()})

Теперь я хочу добавить что-то базовое в качестве имени пользователяи я подозреваю, что мне, возможно, не придется создавать подкласс модели User, предоставляемой с webapp2_extras, поскольку это модель Expando.Не могли бы вы сказать мне, как добавить имя пользователя или обновить пользователя с именем пользователя?Я не пробовал, но мне кажется, что я могу отобразить auth_id, но это не то же самое, что имя пользователя?

Спасибо

Обновление

Кажется, что модель Userмодель для расширения, вы просто «добавляете свойства», например, при создании пользователя:

    username = self.request.POST.get('username')
    password = self.request.POST.get('password')
    # Passing password_raw=password so password will be hashed
    # Returns a tuple, where first value is BOOL. If True ok, If False no new user is created
    user = self.auth.store.user_model.create_user(username, password_raw=password)
    user.name = username

Я не провел тщательного тестирования приведенного выше кода, но кажется, что с webapp2 нам не нужно создавать подклассыПользовательский класс для получения функциональности.

Решение / Обходное решение

class SecureRequestHandler(BaseHandler):
    """
        Only accessible to users that are logged in
    """
    @user_required
    def get(self, **kwargs):
        a = self.app.config.get('foo')
        auser = self.auth.get_user_by_session() 
        userid = auser['user_id']
        user = auth_models.User.get_by_id(auser['user_id'])
        try:
            return "Secure zone %s <a href='%s'>Logout</a>" % (user.name, self.auth_config['logout_url'])
        except (AttributeError, KeyError), e:
            return "Secure zone"

1 Ответ

4 голосов
/ 26 декабря 2011

надеюсь, что это поможет

from webapp2_extras.appengine.auth.models import User
from ndb import key, model

class MUser(User): # child class of User
    displayname = model.StringProperty() # show on screen, auto create 'user-{id}'
    lastaccess = model.DateTimeProperty(auto_now=True)

    @classmethod
    def update_or_insert_user(cls, user):
        """update some user's prop if exited else create new muser
        return : MUser object or None
        """
        u = MUser.get_by_auth_id(user.email())
        if u is None:                               
            ok, u = MUser.create_user(user.email(), id=newid)
            if ok == True:
                u.displayname = 'user-'+str(u.get_id())
            else:
                log.error('create new user error : ' + user.email())
                u = None
        else :          
            u.put() # Update last access (auto fill def in model class)

        return u

class MyPageHandler(NewBaseHandler):
    """
    Only accessible to users that are logged in
    """
    @user_required
    def get(self):
        user = self.get_current_muser()
        self.render_template('mypage.htm', {'user': user.displayname })

    def get_current_muser(self):
        # come from gae login page, convert current gae user to muser
        user = users.get_current_user() # google users
        if user:
            # user have login, try to create or update
            log.info('create user')
            mu = MUser.update_or_insert_user(user)
            if mu:
                # save to session
                self.session['muserid'] = mu.key.id()
                return mu

        return None
...