如何使用webapp2和simpleauth更新用户? [英] How to update User with webapp2 and 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 $ c $你也可以阅读这篇文章以获得更多的想法: ://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屋!