protoRPC:返回dict

时间:2012-11-27 01:36:30

标签: python google-app-engine protorpc

如何通过dict返回protoRPC类似对象?

我尝试使用FieldList无济于事。我只看到以下字段定义:

       'IntegerField',
       'FloatField',
       'BooleanField',
       'BytesField',
       'StringField',
       'MessageField',
       'EnumField',

4 个答案:

答案 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

仅限使用字符串键和简单(非嵌套)值。但是,如果您的数据符合该类别,则此解决方案应该可以正常运行。

这个想法有两个部分:

  1. 创建一个可以保存任意值类型的新字段类型MultiField
  2. 创建一个类似于dict的类型MapField,用于将键值对存储在MultiField类型的列表中。
  3. 你这样使用它:

    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"})
    

    这只是一个开始。可能会更好。欢迎改进。 :)