Python, буферы протокола и получение вложенных сообщений и повторяющихся полей для работы - PullRequest
0 голосов
/ 21 февраля 2012

Я пытаюсь отправить ответ, используя буферы протокола в Python. Ниже приведена структура.

message BidResponse {
  message Ad {
    optional string html_snippet = 1;
    message TemplateParameter {
      optional string parameter_value = 1;
      optional string blank_ad_parameter_value = 8;
      optional string buyer_creative_id = 2;
      optional string click_through_url = 3;
      optional int32 left = 4;
      optional int32 right = 5;
      optional int32 top = 6;
      optional int32 bottom = 7;
      optional int32 backup_index = 9;
    };
    repeated TemplateParameter template_parameter = 13;
    repeated string click_through_url = 4;
    repeated int32 vendor_type = 5;
    message AdSlot {
      required int32 id = 1;
      required int64 max_cpm_micros = 2;
    }
    repeated AdSlot adslot = 3;
  }
  repeated Ad ad = 2;
  optional int32 processing_time_ms = 4;
}

Ниже приведен код Python, который я пытаюсь отправить.

ms = (time.time() - start)*1000
bid_response = realtime_bidding_pb2.BidResponse()
bid_response.processing_time_ms = int(ms)
ad = bid_response.Ad()
ad.html_snippet = """<img src='http://cdn.test.com/test.gif' />"""
ad.click_through_url = """test.com"""

adslot = ad.AdSlot()
adslot.id = adslots_id[0]             
adslot.max_cpm_micros=150000000

Когда я отправляю, используя ниже:

'Content-Type', 'application/octet-stream'
bid_response.SerializeToString()

Все, что возвращается, это bid_response.processing_time_ms.

Я подозреваю, что я не делаю повторение и сообщения правильно.

Ответы [ 2 ]

6 голосов
/ 21 февраля 2012

Я помню, как потратил некоторое время на поиски этого в моем коде Python некоторое время назад. Вы можете найти документацию для интерфейса полей в Python здесь: http://code.google.com/apis/protocolbuffers/docs/reference/python-generated.html#fields.

Вам нужна функция-член add, при этом ваш код будет выглядеть так:

ms = (time.time() - start)*1000
bid_response = realtime_bidding_pb2.BidResponse()
bid_response.processing_time_ms = int(ms)
ad = bid_response.ad.add()
ad.html_snippet = """<img src='http://cdn.test.com/test.gif' />"""
ad.click_through_url = """test.com"""

adslot = ad.adslot.add()
adslot.id = adslots_id[0]             
adslot.max_cpm_micros=150000000
0 голосов
/ 21 февраля 2012

Вы прочитали документацию ?Это совершенно ясно.

Вы должны заменить

ad = bid_response.Ad()

на

ad = bid_response.ad.add()

и аналогично для AdSlot.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...