1

Google App Engine 中是否有一个函数可以在memcache.get(key)不使用db.get()db.get_by_key_name()先调用之前测试字符串是否为有效的“字符串键”?

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

不知何故,我想知道该字符串是否是有效的密钥字符串,而无需先调用数据库,这会破坏使用 memcache 的目的。

4

3 回答 3

1

这可能是确定密钥字符串是否有效的最有效(也是最实用)的方法。该代码显然在尝试从 memcache/datastore 检索实体之前为您执行该测试。更好的是,如有必要,谷歌会更新该代码。

try:
    obj = memcache.get(self.request.get("obj"))
except BadKeyError:
    # give a friendly error message here

另外,考虑切换到 ndb。对键执行 get() 会自动使用两级缓存,本地缓存和内存缓存。您不需要为 memcache 编写单独的代码。

于 2013-05-31T22:31:37.380 回答
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)

于 2013-05-31T23:28:05.737 回答
0

任何对象都是有效的键,前提是该对象可以使用 pickle 进行序列化。如果 pickle.dumps(key) 成功,那么您不应该收到 BadKeyError。

于 2013-05-31T21:14:01.023 回答