Какие правила применяются к key_name в движке приложения? - PullRequest
0 голосов
/ 30 ноября 2011

Я пытаюсь использовать user_id объекта приложения движка приложения (возвращаемый методом User.user_id ()) в качестве имени ключа в моем собственном классе User. Проблема в том, что он постоянно говорит мне, что это неверное имя ключа. Я попробовал sha2'ing и использовать digest (), а также метод hexdigest (), чтобы уменьшить количество возможных символов, но все еще не получился хороший результат. Это потому, что значение слишком длинное или потому что имена ключей не могут содержать определенные символы? А также, как я могу изменить user_id таким образом, чтобы он оставался уникальным, но также использовался как key_name для объекта? Дополнительный бонус, если он использует хеш, чтобы угадать user_id невозможно.

Вот код, где произошла ошибка:

def get_current_user():
    return User.get(db.Key(hashlib.sha1(users.get_current_user().user_id()).hexdigest()))

Сейчас я провожу еще несколько тестов, прислушиваясь к предложениям из комментариев и ответов.

1 Ответ

1 голос
/ 30 ноября 2011

Я не уверен, почему это не работает для вас, у следующего нет проблем, когда я запускаю его в консоли разработчика.

from google.appengine.ext import db
from google.appengine.api import users

user = users.get_current_user()
name = user.user_id()
print db.Key.from_path ('User', name)

Однако, если вы его хешируете (что звучиткак вы можете быть), имейте в виду, что вы можете столкнуться.Я бы не стал использовать хеш и рассмотрел бы некоторые другие способы анонимизации, если вы даете ключ клиентам.Например, другая модель, ключ которой вы можете отдать, в которой хранится ключ пользователя.Другим методом будет шифрование id (используя один и тот же ключ для всех пользователей), а не его хеширование.

Если вы делаете что-то, что генерирует ядро ​​приложения двоичных данных (шифрование / хэширование) (sdkпо крайней мере) имеет проблемы, поэтому вам нужно сначала закодировать его и использовать его в качестве имени ключа.

name = user.user_id()

hashed_name = hashlib.sha1(name).digest()
encoded_name = base64.b64encode (name)
db.Key.from_path ('User', encoded_name)
...