在不首先使用memcache.get(key)
或db.get()
来调用db.get_by_key_name()
之前,Google App Engine中是否有功能来测试字符串是否有效“字符串键”?
在我的情况下,密钥是从用户的get请求传递的:
obj = memcache.get(self.request.get("obj"))
不知怎的,我想知道该字符串是否是一个有效的密钥字符串而不先调用db,这会破坏使用memcache的目的。
答案 0 :(得分:1)
这可能是确定密钥字符串是否有效的最有效(和实用)方法。在尝试从memcache / datastore中检索实体之前,代码显然正在为您执行该测试。更好的是,Google会在必要时更新该代码。
try:
obj = memcache.get(self.request.get("obj"))
except BadKeyError:
# give a friendly error message here
另外,请考虑切换到ndb。对密钥执行get()会自动使用两级缓存,本地缓存和内存缓存。您不需要为memcache编写单独的代码。
答案 1 :(得分:1)
发送到客户端的db模块密钥应该通过str(the_key),它为您提供URL安全编码密钥。您的模板环境等......只需将密钥渲染到模板中即可为您完成此操作。
在从客户端传回密钥时,您应该重新创建密钥
key = db.Key(encoded=self.request.get("obj"))
此时它可能会失败
BadKeyError: Invalid string key "thebadkeystring"=.
如果没有,你有一个有效的密钥
obj = memcache.get(self.request.get("obj"))
实际上不会引发BadKeyError,因为此时您只是使用字符串,只返回None
或值。
所以在这一点上,你所知道的是你缺少钥匙。
但是,您需要使用memcache.get(self.request.get(“obj”))从memcache获取对象,因为db.Key
实例不是有效的memcache密钥。
因此,您将构建一个密钥以在此时验证密钥字符串。当然,如果memcache失败,那么你可以使用刚刚创建的密钥来获取db.get(key)
答案 2 :(得分:0)
任何对象都是有效密钥,前提是可以使用pickle对对象进行序列化。如果pickle.dumps(key)成功,那么你不应该得到BadKeyError。