您是對的,您必須創建您自己的用戶模型並存儲額外信息以及您在應用程序中的任何業務邏輯。所有你需要做的是用額外的username
,name
一起存儲(例如federated_id
)獨有的東西,等
與OpenID登錄後,你會檢查是否該特定federated_id
是在你的數據存儲,你會返回該特定的user_db
,或者使用默認值創建一個新的並返回新創建的user_db
。
重要的是,在您的請求中,您將始終處理您自己的user_db
實體,而不是users.get_current_user()
,因爲這基本上是隻讀和有限的。
下面是一個完整的例子,這也顯示了與get_user()
功能,如果用戶登錄和None
否則,將返回自己的user_db
實體base handler class。如果用戶要登錄的第一次,一個新的USER_DB實體與一些默認值(name
,username
,email
,admin
,federated_id
)創建:
from google.appengine.api import users
from google.appengine.ext import ndb
import webapp2
class User(ndb.Model):
name = ndb.StringProperty(required=True)
username = ndb.StringProperty(required=True)
email = ndb.StringProperty()
federated_id = ndb.StringProperty()
admin = ndb.BooleanProperty()
class BaseHandler(webapp2.RequestHandler):
def get_user_db(self):
federated_user = users.get_current_user()
if not federated_user:
return None
user_db_qry = User.query(User.federated_id == federated_user.user_id())
user_db_list = user_db_qry.fetch(1)
#If that returns non empty list, then return the first element which is the user_db
if user_db_list:
return user_db_list[0]
#Otherwise create a new user_db entity, with default values and return
user_db = User(
name=federated_user.nickname().title(),
username=federated_user.nickname(),
email=federated_user.email(),
federated_id=federated_user.user_id(),
admin=users.is_current_user_admin(),
)
user_db.put()
return user_db
class MainHandler(BaseHandler):
def get(self):
self.response.headers['Content-Type'] = 'text/html'
if self.get_user_db():
self.response.out.write('Hello, %s!</br>' % self.get_user_db().name)
self.response.out.write('<a href="%s">Logout</a>' % (users.create_logout_url(self.request.uri)))
else:
self.response.out.write('Hello, stranger!<br>')
self.response.out.write('<a href="%s">Login</a>' % (users.create_login_url(self.request.uri)))
app = webapp2.WSGIApplication([('/', MainHandler)],
debug=True)
有很多不同的方法解決這個問題,但我認爲這是一個很好的開始來獲得這個想法。
好嗎很好,謝謝你今天下午測試一下,看看它是如何去 – clifgray
你能解釋一下這條線做:user_db_list = User.query(User.federated_id == federated_user.user_id())獲取( 1) – clifgray
@clifgray該行正在從您自己的模型中檢索具有特定federated_id的用戶...如果結果不是空列表,那麼我們有一個贏家.. otherwiser我們必須創建一個實體,然後返回它.. – Lipis