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.
Đượ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
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
@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