在memcache.get()之前测试string是否为有效键

时间:2013-05-31 14:27:06

标签: python google-app-engine python-memcached

在不首先使用memcache.get(key)db.get()来调用db.get_by_key_name()之前,Google App Engine中是否有功能来测试字符串是否有效“字符串键”?

在我的情况下,密钥是从用户的get请求传递的: obj = memcache.get(self.request.get("obj"))

不知怎的,我想知道该字符串是否是一个有效的密钥字符串而不先调用db,这会破坏使用memcache的目的。

3 个答案:

答案 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。