2012-06-25 48 views
5

Vì vậy, tôi đang viết một ứng dụng trong python cho appengine của google trên nền tảng khuôn mẫu jinja2. Tôi đã nhận OpenID để làm việc tốt trên trang web của tôi và nó cho phép người dùng đăng nhập và tôi có thể hiển thị email/ID của họ ở góc trên cùng bên phải.cung cấp cho người dùng openid thông tin bổ sung

Bây giờ tôi muốn người dùng có tên người dùng riêng và có thể lưu trữ một số dữ liệu bổ sung về chúng như lượt truy cập trang và một số bài đăng nhất định đến các khu vực của trang web.

Tôi biết tôi cần tạo bảng trong cơ sở dữ liệu với người dùng và mọi thứ nhưng cách chính xác để làm điều này với OpenID là gì. Tôi muốn tự động tạo người dùng khi ai đó đăng nhập lần đầu tiên nhưng tôi không chắc chắn cách thực hiện điều này một cách hiệu quả. Tôi nghĩ rằng tôi có thể quản lý nó bằng cách chuyển hướng chúng đến một trang sau khi đăng nhập kiểm tra federated_identity của họ trong cơ sở dữ liệu và nếu nó tồn tại ở đó, nó đã chuyển hướng chúng đến trang chủ nhưng nếu không nó sẽ tạo ra một người dùng mới.

Có cách nào hiệu quả hơn để tôi không truy vấn cơ sở dữ liệu mỗi khi ai đó đăng nhập hoặc đó là một cách khá tốt để làm điều đó?

Trả lời

6

Bạn nói đúng, bạn phải tạo mô hình người dùng của riêng mình và lưu trữ thông tin bổ sung và bất kỳ logic nghiệp vụ nào bạn có trong ứng dụng của mình. Tất cả bạn phải làm là để lưu trữ một cái gì đó độc đáo (federated_id chẳng hạn) cùng với các phụ username, name vv

Sau khi đăng nhập với OpenID, bạn sẽ kiểm tra nếu điều đó đặc biệt federated_id là trong kho dữ liệu của bạn và bạn sẽ trả về số user_db cụ thể đó hoặc tạo một cái mới có giá trị mặc định và trả lại số mới user_db.

Điều quan trọng là trong yêu cầu của bạn, bạn sẽ luôn đối phó với thực thể user_db của riêng bạn chứ không phải users.get_current_user() vì điều này về cơ bản chỉ đọc và bị giới hạn.

Đây là một ví dụ đầy đủ, điều đó cũng chứng tỏ một base handler class với get_user() chức năng đó sẽ trở lại user_db thực thể của riêng bạn nếu người dùng đang đăng nhập và None khác. Nếu người dùng sẽ đăng nhập lần đầu tiên, một thực thể user_db mới được tạo ra với một số giá trị mặc định (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) 

Có rất nhiều cách tiếp cận khác nhau cho vấn đề này, nhưng tôi nghĩ đây là một khởi đầu tốt để có được ý tưởng.

+0

Được rồi, cảm ơn tôi sẽ thử nghiệm nó vào chiều nay và xem nó như thế nào – clifgray

+0

bạn có thể giải thích dòng này đang làm gì không: user_db_list = User.query (User.federated_id == federated_user.user_id()). Fetch (1) – clifgray

+0

@clifgray dòng đó đang truy xuất từ ​​mô hình của riêng bạn mà người dùng có cho một federated_id cụ thể ... nếu kết quả không phải là danh sách trống thì chúng tôi có một người chiến thắng .. otherwiser chúng tôi phải tạo một thực thể và sau đó trả lại .. – Lipis

Các vấn đề liên quan