How to update User with webapp2 and simpleauth?

﹥>﹥吖頭↗ 提交于 2020-01-06 15:18:35

问题


I have a profile page for my users where they should be able to update their information. For now they can update their names but I also want phonenumbers, addresses, etc.

The code for updating the name of my user is

class AccountPage(BaseRequestHandler):
    def get(self):
        self.render('accountpage.html', {'request': self.request, 'user': self.current_user,'loggedin': self.logged_in, 'session': self.auth.get_user_by_session(),})
    def post(self):

        user = self.current_user
        user.name = self.request.POST['name']
        user.put()
        self.auth.set_session(
                self.auth.store.user_to_dict(user))

        self.render('accountpage.html', {'request': self.request, 'loggedin': self.logged_in,'user': self.current_user})

But how can I use extra variables such as phonenumbers, address variable etc? The webapp2 User model is an expando model. It did not work to just add the variables to the model:

class User(model.Expando):
    """Stores user authentication credentials or authorization ids."""

    #: The model used to ensure uniqueness.
    unique_model = Unique
    #: The model used to store tokens.
    token_model = UserToken

    created = model.DateTimeProperty(auto_now_add=True)
    updated = model.DateTimeProperty(auto_now=True)
    # ID for third party authentication, e.g. 'google:username'. UNIQUE.
    auth_ids = model.StringProperty(repeated=True)
    # Hashed password. Not required because third party authentication
    # doesn't use password.
    password = model.StringProperty()
    phonenumber = model.StringProperty()
    address = model.StringProperty()

I use simpleauth and I get this error msg from simpleauth:

INFO     2015-07-20 06:09:34,426 authhandlers.py:78] user_dict | {'name': u'DAC', 'user_id': 5620703441190912, 'token': u'c9BbE72EmrgTDpG1Dl4tlo', 'token_ts': 1437371676, 'cache_ts': 1437371676, 'remember': 0} 
ERROR    2015-07-20 06:09:34,437 authhandlers.py:42] 'phonenumber'
INFO     2015-07-20 06:09:34,445 module.py:812] default: "POST /account/ HTTP/1.1" 404 -
INFO     2015-07-20 06:09:34,501 module.py:812] default: "GET /favicon.ico HTTP/1.1" 200 450

In my BaseRequestHandler I have this cached_property that creates an object.

@webapp2.cached_property
def current_user(self):
    """Returns currently logged in user"""
    user_dict = self.auth.get_user_by_session()
    logging.info('user_dict | %s ' % user_dict)
    if user_dict:
        return self.auth.store.user_model.get_by_id(user_dict['user_id'])
    else:
        return api.users.get_current_user()

Then I tried changing the user model but I still get the ERR phone_number when making these changes.

class BaseRequestHandler(webapp2.RequestHandler):

    class User(auth_models.User):
        address = ndb.StringProperty(indexed=False)
        phone_number = ndb.IntegerProperty(indexed=False)

    def dispatch(self):
        # Get a session store for this request.
        self.session_store = sessions.get_store(request=self.request)
        if self.request.host.find('.br') > 0:
            i18n.get_i18n().set_locale('pt-br')
        elif self.request.host.find('klok') > 0:
            i18n.get_i18n().set_locale('sv')
        elif self.request.host.find('business') > 0:
            i18n.get_i18n().set_locale('en')
        else:
            lang_code_get = self.request.get('hl', None)
            if lang_code_get is None:
                lang_code = self.session.get('HTTP_ACCEPT_LANGUAGE', None)
                lang_code_browser = os.environ.get('HTTP_ACCEPT_LANGUAGE')
                if lang_code:
                    i18n.get_i18n().set_locale(lang_code)
                if lang_code_browser and lang_code is None:
                    self.session['HTTP_ACCEPT_LANGUAGE'] = lang_code_browser
                    i18n.get_i18n().set_locale(lang_code_browser)
            else:
                i18n.get_i18n().set_locale(lang_code_get)
        try:
            # Dispatch the request.
            logging.info('trying to dispatch')
            webapp2.RequestHandler.dispatch(self)
        except Exception, ex:
            logging.error(ex)
            self.error(404)
        finally:
            # Save all sessions.
            self.session_store.save_sessions(self.response)

    @webapp2.cached_property
    def jinja2(self):
        """Returns a Jinja2 renderer cached in the app registry"""
        return jinja2.get_jinja2(app=self.app)

    @webapp2.cached_property
    def session(self):
        """Returns a session using the default cookie key"""
        return self.session_store.get_session()

    @webapp2.cached_property
    def auth(self):
        return auth.get_auth()

    @webapp2.cached_property
    def session_store(self):
        return sessions.get_store(request=self.request)

    @webapp2.cached_property
    def auth_config(self):
        """
  ..........Dict to hold urls for login/logout
  ......"""
        return {'login_url': self.uri_for('login'),
                'logout_url': self.uri_for('logout')}

    @webapp2.cached_property
    def current_user(self):
        """Returns currently logged in user"""
        user_dict = self.auth.get_user_by_session()
        logging.info('user_dict | %s ' % user_dict)
        if user_dict:
            return self.auth.store.user_model.get_by_id(user_dict['user_id'])
        else:
            return api.users.get_current_user()

回答1:


As mentioned in the comment above - you should NOT be making any changes in any of the built-in libraries, instead, you can extend them and then add any additional code/properties you need.

So first, you'd need to define your own User model, which would look simmilar to this:

from google.appengine.ext import ndb
import webapp2_extras.appengine.auth.models as auth_models

class User(auth_models.User):
    address = ndb.StringProperty(indexed=False)
    phone_number = ndb.IntegerProperty(indexed=False)

You are only adding the new properties you need or the ones you need to override, so no created / updated / etc as they're inherited from the model you were referring to.

You then need to work with this model inside your BaseRequestHandler class (I'm not sure what the line self.current_user does, you might need to include the code for that as well).

You can also read this article to get some more ideas: http://gosurob.com/post/20024043690/gaewebapp2accounts



来源:https://stackoverflow.com/questions/31509708/how-to-update-user-with-webapp2-and-simpleauth

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!