如何使用webapp2和simpleauth更新用户? [英] How to update User with webapp2 and simpleauth?

查看:181
本文介绍了如何使用webapp2和simpleauth更新用户?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我为我的用户提供了一个配置文件页面,他们应该能够更新他们的信息。现在他们可以更新他们的名字,但我也想要phonenumbers,地址等。





pre> 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})

但是我怎样才能使用额外的变量,如phonenu mbers,地址变量等? webapp2用户模型是expando模型。它只是将变量添加到模型中无效:

  class User(model.Expando):
存储用户认证凭证或授权标识。

#:用于确保唯一性的模型。
unique_model =唯一
#:用于存储令牌的模型。
token_model = UserToken

创建= model.DateTimeProperty(auto_now_add = True)
updated = model.DateTimeProperty(auto_now = True)
#用于第三方认证的ID,例如谷歌:用户名。独特。
auth_ids = model.StringProperty(重复= True)
#哈希密码。不需要,因为第三方认证
#不使用密码。
password = model.StringProperty()
phonenumber = model.StringProperty()
address = model.StringProperty()

我使用 simpleauth ,并且我收到此错误消息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.1404 -
INFO 2015-07-20 06:09:34,501 module.py:812] default:GET /favicon.ico HTTP / 1.1200 450

在我的 BaseRequestHandler 中,我有这个cached_property创建了一个对象。

  @ webapp2.cached_property 
def current_user(self):
返回当前登录的用户
user_dict = self .auth.get_user_by_session()
logging.info('user_dict |%s'%user_dict)
如果user_dict:
返回self.auth.store.user_model.get_by_id(user_dict ['user_id' ])
else:
返回api.users.get_current_user()

然后我尝试更改用户模型,但在进行这些更改时仍然收到 ERR phone_number

  class BaseRequestHandler(webapp2.RequestHandler):
$ b $ class User(auth_models.User):
address = ndb.StringProperty( indexed = False)
phone_number = ndb.IntegerProperty(indexed = False)

def dispatch(self):
#获取该请求的会话存储。
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)
如果lang_code_get为None :
lang_code = self.session.get('HTTP_ACCEPT_LANGUAGE',无)
lang_code_browser = os.environ.get('HTTP_ACCEPT_LANGUAGE')
如果lang_code:
i18n.get_i18n( ).set_locale(lang_code)
如果lang_code_browser和lang_code是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:
#发送请求。
logging.info('试图派发')
webapp2.RequestHandler.dispatch(self)
除了Exception外,例如:
logging.error(ex)
self .error(404)
finally:
#保存所有会话。
self.session_store.save_sessions(self.response)

@ webapp2.cached_property
def jinja2(self):
返回缓存的Jinja2渲染器应用程序注册表
返回jinja2.get_jinja2(app = self.app)

@ webapp2.cached_property
def session(self):
使用默认cookie密钥的会话
返回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保存登录/注销的url
.... ..
return {'login_url':self.uri_for('login'),
'logout_url':self.uri_for('logout')}

@ webapp2.cached_属性
def current_user(self):
返回当前登录的用户
user_dict = self.auth.get_user_by_session()
logging.info('user_dict | %s'%user_dict)
if user_dict:
返回self.auth.store.user_model.get_by_id(user_dict ['user_id'])
else:
返回api.users。 get_current_user()


解决方案

不应该对任何内置库进行任何更改,相反,您可以扩展它们,然后添加任何您需要的其他代码/属性。



首先,您需要定义您自己的 User 模型,这看起来与此类似:

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

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

您只需添加您需要的新属性或需要覆盖的属性,因此不会创建 / 已更新 / etc,因为它们是从您引用的模型继承而来的。



<然后你需要在你的 BaseRequestHandler 类中使用这个模型(我不确定这行是否是 self.current_user
://gosurob.com/post/20024043690/gaewebapp2accountsrel =nofollow> http://gosurob.com/post/20024043690/gaewebapp2accounts


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()

解决方案

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

这篇关于如何使用webapp2和simpleauth更新用户?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆