cli*_*ray 5 python openid google-app-engine jinja2
所以我在jinja2模板平台上为google appengine在python中编写应用程序.我已经让OpenID在我的网站上工作得很好,它允许用户登录,我可以在右上角显示他们的电子邮件/ ID.
现在我希望用户拥有自己的用户名,并能够存储一些关于它们的其他数据,例如站点访问和某些帖子到站点区域.
我知道我需要在数据库中创建一个包含用户和所有内容的表,但是使用OpenID执行此操作的正确方法是什么.我想在有人第一次登录时自动创建用户但我不太确定如何有效地执行此操作.我想我可以通过他们重定向到登录后的页面检查他们的federated_identity在数据库中进行管理,如果存在有它已经只是他们重定向到主页,但如果没有它会创建一个新用户.
是否有一种更有效的方式,以便每次有人登录时我都不会查询数据库,或者这是一种相当不错的方式吗?
您是对的,您必须创建自己的用户模型并存储您的应用程序中的额外信息和任何业务逻辑.所有你需要做的是存储(一些独特的federated_id,具有额外例如沿着)username,name等等.
使用OpenID登录后,您将检查该特定内容federated_id是否在您的数据存储区中,并且您将返回该特定内容user_db,或者创建一个具有默认值的新特定内容并返回新创建的内容user_db.
重要的是,在您的请求中,您将始终处理您自己的user_db实体,而不是users.get_current_user()因为这基本上是只读且有限的.
这是一个完整的示例,它还演示了一个基本处理程序类,该get_user()函数将user_db在用户登录时返回您自己的实体,None否则将返回.如果用户要登录的第一次,一个新的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)
Run Code Online (Sandbox Code Playgroud)
这个问题有很多不同的方法,但我认为这是一个很好的开始.