2013-05-31 59 views
1

Google App Engine中是否有函数在不使用db.get()db.get_by_key_name()的情况下调用memcache.get(key)之前测试字符串是否有效'string key'?在memcache.get()之前测试字符串是否有效密钥

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

不知怎的,我想知道,如果该字符串是一个有效的密钥字符串前未调用分贝,这会破坏目的使用memcache。

+0

你是什么意思的“有效”的关键?你的意思是“以正确的格式为一个关键字符串”,或者你的意思是“引用数据存储区中的实际对象”? –

+0

我的意思是一个关键字符串的正确格式,以避免错误'raise datastore_errors.BadKeyError('无效的字符串关键%s。'%编码)''。谢谢您的帮助。 – user1961

回答

1

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

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

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

0

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

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)

+0

感谢您的帮助 - 我担心我无法控制入站字符串,即用户可以操纵它。我认为关键的重新创建将用于这些目的。 – user1961

+0

完全可能的关键操作。验证特定主体(用户,组)是否有权访问实体的授权框架可能是解决此风险的一种策略。 –

相关问题