是否有一个功能在谷歌应用程序引擎测试如果字符串是有效的'字符串键'之前调用memcache.get(key)
不使用db.get()
或db.get_by_key_name()
第一?
在我的例子中,密钥是从用户的get请求传递过来的:obj = memcache.get(self.request.get("obj"))
我想知道这个字符串是否是一个有效的键字符串,而不需要先调用db,这会破坏使用memcache的目的。
这可能是确定密钥字符串是否有效的最有效(也是最实用)的方法。代码显然在尝试从memcache/datastore检索实体之前为您执行该测试。更好的是,如果有必要,谷歌会更新代码。
try:
obj = memcache.get(self.request.get("obj"))
except BadKeyError:
# give a friendly error message here
另外,考虑切换到ndb。对键执行get()会自动使用两个级别的缓存,本地和memcache。您不需要为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 key。
因此,此时您将构造一个键来验证键字符串。当然,如果memcache get失败,那么你可以使用db.get(key)
任何对象都是有效的键,只要该对象可以使用pickle序列化。如果pickle.dumps(key)成功,那么你不应该得到BadKeyError。