我目前正在使用Python / App Engine / SimpleAuth为我的应用程序提供OAuth登录。当前的工作流程是用户使用OAuth登录,之后他们可以在应用程序中为自己创建唯一的用户名。
在创建webapp2用户实体后,我在创建唯一用户名时遇到问题。我在webapp2 model中看到有一种方法可以在应用程序实体组中启用唯一的用户名,但我不知道如何为自己设置它。 (我正在使用SimpleAuth为其他OAuth提供商设置所有内容。)
我想查看用户提交的“用户名”是否存在,以及是否不将其作为属性添加到当前登录的用户。我很感激任何关于此的帮助/指示!
答案 0 :(得分:4)
我认为您可以扩展webapp2_extras.appengine.auth.models.User
并添加用户名属性,例如
from webapp2_extras.appengine.auth.models import User as Webapp2User
class User(Webapp2User):
username = ndb.StringProperty(required=True)
然后,要创建一个webapp2应用程序,您需要一个包含以下内容的配置:
APP_CFG = {
'webapp2_extras.auth': {
'user_model': User, # default is webapp2_extras.appengine.auth.models.User
'user_attributes': ['username'] # list of User model properties
}
}
app = webapp2.WSGIApplication(config=APP_CFG)
有鉴于此,使用以下代码创建新用户将确保用户名是唯一的(由Unique模型确保):
auth_id = 'some-auth-id' # e.g. 'google:123456789', see simpleauth example.
ok, props = User.create_user(auth_id, unique_properties=['username'],
username='some-username',
...)
if not ok:
# props list will contain 'username', indicating that
# another entity with the same username already exists
...
问题是,使用此配置,您必须在创建时设置username
。
如果您想使用户名可选,或者让用户稍后设置/更改它,您可能希望将上述代码更改为以下代码:
class User(Webapp2User):
username = ndb.StringProperty() # note, there's no required=True
# when creating a new user:
auth_id = 'some-auth-id' # e.g. 'google:123456789', see simpleauth example.
ok, props = User.create_user(auth_id, unique_properties=[], ...)
基本上,unique_properties
将为空列表(或者您可以跳过它)。此外,您可以暂时将username
属性分配给user.key.id()
之类的内容,直到用户决定将其用户名更改为更有意义的内容为止。例如,使用Google+个人资料链接:我的目前是https://plus.google.com/114517983826182834234,但如果他们允许我更改它,我会尝试https://plus.google.com/+IamNotANumberAnymore
然后,在“更改/设置用户名”表单处理程序中,您可以检查用户名是否已存在并更新用户实体(如果不存在):
def handle_change_username(self):
user = ... # get the user who wants to change their username
username = self.request.get('username')
uniq = 'User.username:%s' % username
ok = User.unique_model.create(uniq)
if ok:
user.username = username
user.put()
else:
# notify them that this username
# is already taken
...
User.unique_model.create(uniq)
将创建具有给定值的Unique
实体(如果它不存在)。在这种情况下,ok
将为True
。否则,ok
将为False
,表示具有该值的实体(在这种情况下为唯一用户名)已存在。
此外,您可能希望将User.unique_model.create()
和user.put()
放在同一个事务中(它将是XG,因为它们位于不同的实体组中)。
希望这有帮助!