13

最新のAppEngineSDK(1.2.1)には、ユーザーのメールアドレスに基づいてユーザーアカウントのIDを計算するAPI呼び出しがあります。(ユーザーが後でアドレスを変更しても、IDは同じままです。)詳細については、一意の不透明なユーザーIDに関するこの質問を参照してください。ただし、このAPI呼び出しに問題があります。

user_id()ログインしたユーザーに対して機能します(つまり、からですが、コンストラクターによって作成されたオブジェクトに対してusers.get_current_user)返されます。**何が得られますか?Noneusers.User()

たとえば、優れたApp Engineコンソールを使用すると、このコードは機能しません

>>> import google.appengine.api.users
>>> me = google.appengine.api.users.get_current_user()
>>> me
users.User(email='jason.h.smith@gmail.com',_user_id='105261964646342707921')
>>> me.user_id()
'105261964646342707921'
>>> somebody = google.appengine.api.users.User('someone@gmail.com')
>>> somebody
users.User(email='someone@gmail.com')
>>>somebody.user_id()
>>> type(somebody.user_id())
<type 'NoneType'>

メールアドレスをユーザーIDに変換する簡単な方法が必要です。 事前にGoogleからこのIDを強制するにはどうすればよいですか。またはそれが不可能な場合は、なぜですか?

編集:これが現在の回避策です。

ニック・ジョンソンの回答に感謝します。これが彼の実際の解決策です:

>>> from google.appengine.ext import db
>>> from google.appengine.api import users
>>> class User(db.Model):
...   user = db.UserProperty(required=True)
...
>>> def email_to_userid(address):
...   """Return a stable user_id string based on an email address, or None if
...   the address is not a valid/existing google account."""
...   u = users.User(address)
...   key = User(user=u).put()
...   obj = User.get(key)
...   return obj.user.user_id()
>>> email_to_userid('jason.h.smith@gmail.com')
u'105261964646342707921'
>>> email_to_userid('this@is-an-invalid-email-address')
>>> email_to_userid('this@is-an-invalid-email-address') is None
True
4

2 に答える 2

21

現在の回避策は、Userオブジェクトを作成し、それをデータストアに保存して、再度フェッチすることです。メールが有効なGoogleアカウントに対応している場合、返されたエンティティのUserオブジェクトにはuser_idフィールドが入力されます。

于 2009-05-03T11:02:28.270 に答える
1

提案されたソリューションをNDBで機能させるには、getメソッドにuse_cache = False、use_memcache=Falseを追加するだけです。つまり obj = key.get(use_cache=False, use_memcache=False) 、これにより、user_idパラメータが入力されたデータストアからエンティティを取得することが保証されます(これが有効なGoogleアカウントである場合のみ)。

于 2016-12-05T00:31:17.750 に答える