protoRPC:返回dict

jld*_*ont 3 python google-app-engine protorpc

如何dict通过一个类似的对象返回protoRPC

我试过用了 FieldList无效.我只看到以下字段定义:

       'IntegerField',
       'FloatField',
       'BooleanField',
       'BytesField',
       'StringField',
       'MessageField',
       'EnumField',
Run Code Online (Sandbox Code Playgroud)

bos*_*ter 9

有两种情况:

1)你dict有一个明确定义的模式:这是ProtoRPC的最佳用例,如果可能的话,你应该尝试将它放入模式中.在这种情况下,您将使用一个MessageFieldMessage您的字典中的架构匹配的类.

例如,而不是

{'amount': 31, 'type': 'fish', mine: False}
Run Code Online (Sandbox Code Playgroud)

你可以定义

from protorpc import messages
class MyCatch(messages.Message):
  amount = messages.IntegerField(1)
  type = messages.StringField(2)
  mine = messages.BooleanField(3)
Run Code Online (Sandbox Code Playgroud)

然后在字段中使用此消息定义

messages.MessageField(MyCatch, index, ...)
Run Code Online (Sandbox Code Playgroud)

2)您dict没有明确定义的模式:在这种情况下,您可以使用json将字典转储到字符串并请求ensure_ascii=True确保返回类型是bytes(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))
Run Code Online (Sandbox Code Playgroud)

默认使用ensure_ascii是可选True的,但这可能会根据您的环境而改变.

相反,您可以使用pickle序列化字典.该方法pickle.dumps始终输出ASCII /二进制,所以通过交换json.dumpspickle.dumps和下降的ensure_ascii=True,你有同样的结果.