其他分享
首页 > 其他分享> > 创建实体后(使用Simpleauth)将用户名属性添加到webapp2用户模型

创建实体后(使用Simpleauth)将用户名属性添加到webapp2用户模型

作者:互联网

我目前正在使用Python / App Engine / SimpleAuth向我的应用程序提供OAuth登录.当前的工作流程是用户使用OAuth登录,以后可以在应用程序中为自己创建唯一的用户名.

在创建webapp2用户实体后,创建唯一的用户名时遇到问题.我看到在webapp2 model中,有一种方法可以在应用程序实体组中启用唯一的用户名,但是我不知道如何为自己设置用户名. (我正在使用SimpleAuth为其他OAuth提供程序设置所有内容.)

我想检查是否存在用户提交的“用户名”,以及是否不将其作为属性添加到当前登录的用户.我将不胜感激对此的任何帮助/指标!

解决方法:

我认为您可以扩展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
  ...

问题是,使用此配置,您必须在创建期间设置用户名.

如果您想将用户名设置为可选,或者让用户稍后再设置/更改,则可能需要将上述代码更改为类似以下内容:

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()之类的内容,直到用户决定将其username更改为更有意义的名称为止.以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)将使用给定值创建一个唯一实体.在这种情况下,ok将为True.否则,ok将为False,这表示具有该值的实体(在这种情况下为唯一的用户名)已经存在.

另外,您可能希望将User.unique_model.create()和user.put()放在同一事务中(由于它们位于不同的实体组中,因此将为XG).

希望这可以帮助!

标签:app-engine-ndb,google-app-engine,oauth,python
来源: https://codeday.me/bug/20191030/1968770.html