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



是否有一个功能在谷歌应用程序引擎测试如果字符串是有效的'字符串键'之前调用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。

相关内容

  • 没有找到相关文章

最新更新