I’m trying to use an app engine User object’s user_id (returned by the User.user_id() method) as a key_name in my own User class. The problem is that it keeps telling me that it’s an invalid key_name. I’ve tried sha2’ing it, and using the digest() as well as the hexdigest() method to reduce the number of possible characters, but still no good result. Is this because the value is too long, or because key names can’t have certain characters? And also, how can I modify a user_id in such a way that it stays unique, but is also usable as a key_name for an entity? Extra bonus if it uses a hash so that thje user_id can’t be guessed.
Here is the code where the error occured:
def get_current_user():
return User.get(db.Key(hashlib.sha1(users.get_current_user().user_id()).hexdigest()))
I’m now doing some more testing, concidering suggestions from the comments and answer.
I’m not sure why it isn’t working for you, the following has no issues when I run it in the dev console.
However if you are hashing it (which it sounds like you may be), be aware that you may get a collision. I would avoid against using a hash and would consider some other means of anonymization if you are giving the key to clients. Such as another model whose key you can give away, that has the user’s key stored in it. Another method would be to encrypt the
id(using the same key for all users) rather than hash it.If you are doing something that generates binary data (encryption / hash digest) app engine (the sdk at-least) has issues, so you need to encode it first, and use that as the key_name.