如何通过dict
返回protoRPC
类似对象?
我尝试使用FieldList
无济于事。我只看到以下字段定义:
'IntegerField',
'FloatField',
'BooleanField',
'BytesField',
'StringField',
'MessageField',
'EnumField',
答案 0 :(得分:9)
有两种情况:
1)您的dict
具有明确定义的架构:这是ProtoRPC的最佳用例,如果可能,您应该尝试将其纳入架构。在这种情况下,您可以使用MessageField
一些与您字典中的架构匹配的Message
类。
例如,而不是
{'amount': 31, 'type': 'fish', mine: False}
你可以定义
from protorpc import messages
class MyCatch(messages.Message):
amount = messages.IntegerField(1)
type = messages.StringField(2)
mine = messages.BooleanField(3)
然后通过
在字段中使用此消息定义messages.MessageField(MyCatch, index, ...)
2)您的dict
没有明确定义的架构:在这种情况下,您可以使用json
将字典转储为字符串并请求{{1确保返回类型是一个字节(ensure_ascii=True
)对象。然后你可以使用str
。
例如:
BytesField
使用import json
class MyMessage(messages.Message):
some_dict = messages.BytesField(1)
my_dict = {'amount': 31, 'type': 'fish', mine: False}
message = MyMessage(some_dict=json.dumps(my_dict, ensure_ascii=True))
是可选的,因为ensure_ascii
是默认设置,但这可能会因您的环境而异。
相反,您可以使用True
来序列化字典。方法pickle
始终输出ASCII /二进制,因此通过换取pickle.dumps
json.dumps
并删除pickle.dumps
,您将获得相同的结果。
答案 1 :(得分:3)
可以像这样创建自定义JsonField
:
In [1]: class JsonField(messages.StringField):
type = dict
然后您可以将其用作任何其他字段:
In [2]: class MyMessage(messages.Message):
data = JsonField(1)
In [3]: m = MyMessage(data={"foo": "bar"})
In [4]: m.data
Out [4]: {'foo': 'bar'}
答案 2 :(得分:2)
对于已批准答案中的第一个选项,我们可以添加一个参数repeated = True,因此我们将有一个json列表作为答案。我在https://developers.google.com/appengine/docs/python/tools/protorpc/overview?hl=en#Defining_the_Response_Message
查看了相关信息答案 3 :(得分:0)
有点涉及,但我有一个非常接近protorpc
的dict实现的配方:https://gist.github.com/linuxluser/32d4a9c36ca0b8715ad4
仅限使用字符串键和简单(非嵌套)值。但是,如果您的数据符合该类别,则此解决方案应该可以正常运行。
这个想法有两个部分:
MultiField
。MapField
,用于将键值对存储在MultiField
类型的列表中。你这样使用它:
import messages
import mapfield
class MyMessage(messages.Message):
some_dict = mapfield.MapField(1)
my_message = MyMessage(some_dict={"foo": 7, "bar": False, "baz": 9.2, "qux": "nog"})
这只是一个开始。可能会更好。欢迎改进。 :)