Сначала я использовал что-то вроде:
key_name = '%s|%s' % ('facebook', facebook_uid)
и
key_name = '%s|%s' % ('myapp', email)
Это хорошо, и поиск быстрый, но в нем отсутствует поддержка входа в систему от нескольких провайдеров (т.е. пользователь хочет иметь возможность войти в систему, используя как Google, так и Facebook).
Это моё настоящее решение:
class User(db.Model):
accounts = StringListProperty() # ['facebook|1234', 'google|4321']
email = StringProperty()
password = StringProperty()
Поиск выполняется медленнее, но выполняется только один раз при входе в систему, после чего я сохраняю user.key (). Id () в сеансе и использую его. Это также хорошо, потому что вы можете связать пользователя с комбо электронной почты / пароля. Недостатком является то, что вы должны принудительно вводить уникальность для своих ключей (адрес электронной почты, идентификатор Facebook, идентификатор Google и т. Д.).