Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在memcache.get()之前测试字符串是否为有效密钥_Python_Google App Engine_Python Memcached - Fatal编程技术网

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

Python 在memcache.get()之前测试字符串是否为有效密钥,python,google-app-engine,python-memcached,Python,Google App Engine,Python Memcached,Google App Engine中是否有一个函数,可以在调用memcache.get(key)之前测试字符串是否为有效的“字符串键”,而不使用db.get()或db.get by_key\u name() 在我的例子中,密钥是从用户的get请求传递的: obj=memcache.get(self.request.get(“obj”)) 不知何故,我想知道该字符串是否是有效的密钥字符串,而不首先调用db,这将破坏使用memcache的目的。任何对象都是有效的密钥,前提是可以使用pickle序列化

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

在我的例子中,密钥是从用户的get请求传递的:
obj=memcache.get(self.request.get(“obj”))


不知何故,我想知道该字符串是否是有效的密钥字符串,而不首先调用db,这将破坏使用memcache的目的。

任何对象都是有效的密钥,前提是可以使用pickle序列化该对象。如果pickle.dumps(key)成功,则不应出现BadKeyError。

这可能是确定密钥字符串是否有效的最有效(也是最实用)的方法。代码显然是在尝试从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:无效的字符串键“thebadkeystring”=。

如果没有,您有一个有效的密钥

obj=memcache.get(self.request.get(“obj”))
实际上不会引发BadKeyError,因为此时您正在处理一个字符串,而只会返回一个值

所以在这一点上,你所知道的就是你少了一把钥匙

但是,您需要使用memcache.get(self.request.get(“obj”))从memcache获取对象,因为
db.Key
实例不是有效的memcache键


因此,此时您将构造一个密钥来验证密钥字符串。当然,如果memcache get失败,那么您可以使用刚刚创建的密钥以
db.get(key)

获取对象,您所说的“有效”密钥是什么意思?您是指“密钥字符串的正确格式”,还是指“引用数据存储中的实际对象”?我指的是密钥字符串的正确格式,以避免出现错误
引发数据存储\u错误。BadKeyError('无效的字符串密钥%s.%encoded)
。谢谢你的帮助。谢谢你的帮助-我担心我无法控制入站字符串,即用户可以操纵它。我认为重新创建密钥将用于这些目的。密钥操作完全可能。验证特定主体(用户、组)是否具有访问实体的权限的授权框架可能是解决此风险的一种策略。