2012-06-25 13 views
5

दें इसलिए मैं jinja2 templating प्लेटफ़ॉर्म पर Google appengine के लिए अजगर में एक ऐप लिख रहा हूं। मुझे ओपनआईडी को मेरी साइट पर ठीक काम करने के लिए मिला है और यह उपयोगकर्ता को लॉगिन करने की इजाजत देता है और मैं अपने ईमेल/आईडी को ऊपर दाएं कोने में प्रदर्शित कर सकता हूं।खुले उपयोगकर्ता को अतिरिक्त जानकारी

अब मैं चाहता हूं कि उपयोगकर्ता अपने स्वयं के उपयोगकर्ता नाम प्राप्त करें और साइट के क्षेत्रों में साइट विज़िट और कुछ पोस्ट जैसे उनके बारे में कुछ अतिरिक्त डेटा स्टोर करने में सक्षम हों।

मुझे पता है कि मुझे डेटाबेस और उपयोगकर्ताओं के साथ डेटाबेस में एक टेबल बनाने की आवश्यकता है, लेकिन ओपनआईडी के साथ ऐसा करने का सही तरीका क्या है। जब कोई पहली बार लॉग इन करता है तो मैं स्वचालित रूप से उपयोगकर्ता को बनाना चाहता हूं लेकिन मुझे पूरा यकीन नहीं है कि यह कुशलतापूर्वक कैसे करें। मुझे लगता है कि मैं इसे लॉगिन के बाद किसी पृष्ठ पर रीडायरेक्ट करके प्रबंधित कर सकता हूं जो डेटाबेस में अपने फ़ेडरेटेड_डिडिटी को जांचता है और यदि यह मौजूद है तो यह पहले से ही उन्हें होम पेज पर रीडायरेक्ट करता है लेकिन यदि यह कोई नया उपयोगकर्ता नहीं बनाता है।

क्या कोई और अधिक प्रभावी तरीका है ताकि जब भी कोई लॉग इन करता है तो डेटाबेस से पूछताछ नहीं कर रहा है या यह करने का एक शानदार सभ्य तरीका है?

उत्तर

6

आप सही हैं, आपको अपना खुद का उपयोगकर्ता मॉडल बनाना होगा और अतिरिक्त जानकारी और आपके आवेदन में जो भी व्यावसायिक तर्क है उसे स्टोर करना होगा। आपको बस इतना करना है अतिरिक्त 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) 

इस समस्या के कई विभिन्न दृष्टिकोण हैं, लेकिन मुझे लगता है कि विचार पाने के लिए यह एक अच्छी शुरुआत है।

+0

ठीक है, धन्यवाद, मैं आज दोपहर इसका परीक्षण करूंगा और देख सकता हूं कि यह – clifgray

+0

कैसे दिखाता है कि यह लाइन क्या कर रही है: user_db_list = User.query (User.federated_id == federated_user.user_id())। Fetch (1) – clifgray

+0

@clifgray वह लाइन आपके मॉडल से पुनर्प्राप्त हो रही है जो उपयोगकर्ता को एक विशिष्ट federated_id के लिए है ... यदि परिणाम खाली सूची नहीं है तो हमारे पास विजेता है .. अन्य व्यक्ति हमें एक इकाई बनाना है और फिर इसे वापस करना है .. – Lipis

संबंधित मुद्दे