आप सही हैं, आपको अपना खुद का उपयोगकर्ता मॉडल बनाना होगा और अतिरिक्त जानकारी और आपके आवेदन में जो भी व्यावसायिक तर्क है उसे स्टोर करना होगा। आपको बस इतना करना है अतिरिक्त username
, name
के साथ साथ, (उदाहरण के लिए federated_id
) कुछ अद्वितीय स्टोर करने के लिए आदि
OpenID के साथ प्रवेश करने के बाद है, तो आप जांच करेगा कि उस विशेष federated_id
अपने डेटासंग्रह में है और आप करेंगे उस विशेष user_db
को वापस करें, या डिफ़ॉल्ट मानों के साथ एक नया बनाएं और नव निर्मित user_db
लौटाएं।
महत्वपूर्ण बात यह है कि आपके अनुरोधों में आप हमेशा अपने user_db
इकाई से निपटेंगे और users.get_current_user()
नहीं क्योंकि यह मूल रूप से केवल सीमित और सीमित है।
यहाँ एक पूर्ण उदाहरण के लिए, यह भी कहा कि get_user()
समारोह है कि अपनी खुद की user_db
इकाई वापस आ जाएगी, तो उपयोगकर्ता के None
अन्यथा लॉग इन और है के साथ एक 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 के लिए है ... यदि परिणाम खाली सूची नहीं है तो हमारे पास विजेता है .. अन्य व्यक्ति हमें एक इकाई बनाना है और फिर इसे वापस करना है .. – Lipis