당신 말이 맞아요, 당신은 자신의 사용자 모델을 생성하고 추가 정보와 당신이 당신의 어플리케이션에 가지고있는 비즈니스 로직을 저장해야합니다. 당신이해야 할 모든 오픈 아이디로 로그인 후, 추가 username
, name
와 함께 등
(예 : federated_id
) 독특한 무언가를 저장하는 것입니다, 특정 federated_id
이 데이터 저장소에있는 경우 당신은 확인하고 당신은 것입니다 그 특정 user_db
을 반환하거나 기본값을 사용하여 새 값을 만들고 새로 만든 user_db
을 반환하십시오.
중요한 것은 귀하의 요청에 항상 users.get_current_user()
이 아닌 귀하의 user_db
엔티티를 처리한다는 것입니다. 이는 기본적으로 읽기 전용이며 제한적이기 때문입니다.
다음은 또한 사용자가 로그인하고 None
, 그렇지 않은 경우 자신의 user_db
개체를 반환합니다 get_user()
기능을 가진 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()). fetch (1) – clifgray
@clifgray 특정 Federated_id에 대한 사용자가 자신의 모델에서 검색하는 경우 ... 결과가 빈 목록이 아닌 경우 우승자가 있습니다. otherwiser 우리는 하나의 엔티티를 만든 다음 반환해야합니다. .. – Lipis