Google App Engine 中是否有一个函数可以在memcache.get(key)
不使用db.get()
或db.get_by_key_name()
先调用之前测试字符串是否为有效的“字符串键”?
在我的情况下,密钥是从用户的获取请求中传递的:
obj = memcache.get(self.request.get("obj"))
不知何故,我想知道该字符串是否是有效的密钥字符串,而无需先调用数据库,这会破坏使用 memcache 的目的。
Google App Engine 中是否有一个函数可以在memcache.get(key)
不使用db.get()
或db.get_by_key_name()
先调用之前测试字符串是否为有效的“字符串键”?
在我的情况下,密钥是从用户的获取请求中传递的:
obj = memcache.get(self.request.get("obj"))
不知何故,我想知道该字符串是否是有效的密钥字符串,而无需先调用数据库,这会破坏使用 memcache 的目的。
这可能是确定密钥字符串是否有效的最有效(也是最实用)的方法。该代码显然在尝试从 memcache/datastore 检索实体之前为您执行该测试。更好的是,如有必要,谷歌会更新该代码。
try:
obj = memcache.get(self.request.get("obj"))
except BadKeyError:
# give a friendly error message here
另外,考虑切换到 ndb。对键执行 get() 会自动使用两级缓存,本地缓存和内存缓存。您不需要为 memcache 编写单独的代码。
发送到客户端的 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)
任何对象都是有效的键,前提是该对象可以使用 pickle 进行序列化。如果 pickle.dumps(key) 成功,那么您不应该收到 BadKeyError。