2012-06-25 14 views
5

Jinja2 şablon platformunda google appengine için python uygulamasında bir uygulama yazıyorum. OpenID'yi sitemde gayet iyi çalışmam için aldım ve kullanıcının giriş yapmasına izin veriyor ve e-postalarını/kimliklerini sağ üst köşede gösterebiliyorum.openid kullanıcılarına ek bilgi verin

Artık kullanıcıların kendi kullanıcı adlarına sahip olmalarını ve site ziyaretleri ve belirli yayınlar gibi bazı ek verileri sitenin alanlarına kaydedebilmelerini istiyorum.

Veritabanında kullanıcılar ve her şeyle birlikte bir tablo oluşturmam gerektiğini biliyorum, ancak OpenID ile bunu yapmanın doğru yolu nedir. Birisi ilk kez oturum açtığında otomatik olarak kullanıcı oluşturmak istiyorum ama bunu nasıl verimli bir şekilde yapacağından emin değilim. Bir veritabanına federal_gördüğünü denetleyen bir giriş yaptıktan sonra onları bir sayfaya yönlendirerek yönetebileceğimi düşünüyorum ve zaten varsa, bunları ana sayfaya yönlendiriyor ancak yeni bir kullanıcı oluşturmuyorsa.

Daha verimli bir yol var mı? Böylece veritabanını sorguladığımda birisi oturum açtığında veya bunu yapmak için iyi bir yöntem mi?

cevap

6

Haklısınız, kendi Kullanıcı modelinizi yaratmanız ve ek bilgileri ve uygulamanızdaki iş mantığınızı saklamanız gerekir. Tek yapmanız gereken tüm OpenID ile giriş yaptıktan sonra ekstra username, name ile birlikte vb

(örneğin federated_id) benzersiz bir şey saklamak için bir nokta, özellikle federated_id sizin veri deposuna olup olmadığını kontrol edecek ve yapacaksın İlgili user_db'u döndürün veya varsayılan değerlerle yeni bir tane oluşturun ve yeni oluşturulan user_db'u döndürün.

Önemli olan, isteğinize bağlı olarak, users.get_current_user()'un kendi user_db varlığınızla her zaman ilgilenecektir, çünkü bu temel olarak yalnızca okunabilir ve sınırlıdır.

Burada da kullanıcı oturum ve None aksi takdirde kendi user_db varlık dönecektir get_user() fonksiyonu ile bir base handler class gösteren tam bir örnek vardır. kullanıcı ilk kez giriş yapacak, yeni bir user_db varlık bazı varsayılan değerler (name, username, email, admin, federated_id) ile oluşturulur: Bu sorunun birçok farklı yaklaşım vardır

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) 

, ama bence bu fikri elde etmek için iyi bir başlangıç.

+0

tamam harika, teşekkürler bu öğleden sonra test edeceğim ve nasıl gittiğini göreceksiniz – clifgray

+0

Bu satırın ne yaptığını açıklayabilir misiniz: user_db_list = User.query (User.federated_id == federated_user.user_id()). 1) – clifgray

+0

@clifgray bu satırın kendi modelinizden belirli bir federated_id için sahip olan kullanıcıdan alınıyor ... eğer sonuç boş bir liste değilse, o zaman bir kazananımız var. Otherwiser bir varlık yaratmalı ve sonra .. – Lipis