$ .param сериализованный объект в JSON - PullRequest
0 голосов
/ 16 ноября 2018

Я отправляю данные с клиента на сервер ( Python ), используя $. FileDownload .API получает данные, но в состоянии jQuery fileDownload docs данные сериализуются с использованием $ .param .Проблема в том, что мне нужно иметь данные в формате JSON , чтобы я мог обработать их и создать файл, используя ключ: пары значений .Я пытался понять это, но, похоже, ничего не было сделано, чтобы "десериализовать" это.Также кажется, что я не могу сделать $. FileDownload для отправки данных в виде объекта JSON .Можно ли как-нибудь преобразовать сериализованные данные в JSON?

Вот мой запрос JavaScript:

let data = {
  'name': item.Name,
  'rows': item.rows
}

window.$.fileDownload('/api/export-report-excel', {
  httpMethod: 'POST',
  encodeHTMLEntities: true,
  data: data
})

В своем API я пробовал методы json (json.dumps и т. Д.)но сериализованный объект не может быть преобразован.

$. fileDownload сообщает:

// данные должны быть объектом (который будет $ .param serialized) или уже ключ = значение параметра строка

РЕДАКТИРОВАТЬ:

В моем Falcon API :

@route('/api/export-report-excel')
class ExportReportToExcel(object):

  def on_post(self, req, resp):
    data = req.stream.read()
    log.info(data)

log.info (данные) вывод:

b'name = Приоритет + Правила и строки% 5B0% 5D% 5BSegment% 5D = HH + wo + TV & rows% 5B0% 5D% 5BValue% 5D = 6 & строки% 5B0% 5D% 5BCampaignType% 5D = CampaignType% 3F & строки% 5B0% 5D% 5BCampaignSubtype% 5D = Предопределенный + Контракт & строки% 5B0% 5D% 5BChannel% 5D = ветер + МАГАЗИН и строка% 5B0% 5D% 5BPriority% 5D= 1 & строки% 5B1% 5D% 5BSegment% 5D = HH + горе + TV & строки% 5B1% 5D% 5BValue% 5D = 6 & строки% 5B1% 5D% 5BCampaignType% 5D = CampaignType% 3F & строки% 5B1% 5D% 5BCampaignSubtype% 5D = Предопределенный + Контракт & строк% 5B1% 5D% 5BChannel% 5D = SMART + ветер + STORE + МОЛЛ & строк% 5B1% 5D% 5Briority% 5D = 2 '

1 Ответ

0 голосов
/ 16 ноября 2018

Это данные в кодированной форме, которые вы можете проанализировать в Python, используя urllib.parse.parse_qs.

>>> from urllib import parse
>>> parse.parse_qs('name=Priority+Rules&rows%5B0%5D%5BSegment%5D=HH+wo+TV&rows%5B0%5D%5BValue%5D=6&rows%5B0%5D%5BCampaignType%5D=CampaignType%3F&rows%5B0%5D%5BCampaignSubtype%5D=Predefined+Contract&rows%5B0%5D%5BChannel%5D=WIND+STORE&rows%5B0%5D%5BPriority%5D=1&rows%5B1%5D%5BSegment%5D=HH+wo+TV&rows%5B1%5D%5BValue%5D=6&rows%5B1%5D%5BCampaignType%5D=CampaignType%3F&rows%5B1%5D%5BCampaignSubtype%5D=Predefined+Contract&rows%5B1%5D%5BChannel%5D=SMART+WIND+STORE+MALL&rows%5B1%5D%5BPriority%5D=2')

{'name': ['Priority Rules'],
 'rows[0][Segment]': ['HH wo TV'],
 'rows[0][Value]': ['6'],
 'rows[0][CampaignType]': ['CampaignType?'],
 'rows[0][CampaignSubtype]': ['Predefined Contract'],
 'rows[0][Channel]': ['WIND STORE'],
 'rows[0][Priority]': ['1'],
 'rows[1][Segment]': ['HH wo TV'],
 'rows[1][Value]': ['6'],
 'rows[1][CampaignType]': ['CampaignType?'],
 'rows[1][CampaignSubtype]': ['Predefined Contract'],
 'rows[1][Channel]': ['SMART WIND STORE MALL'],
 'rows[1][Priority]': ['2']}

Я не знаю Falcon, но я уверен, что у него есть способ доступа к этим даннымнапрямую, без доступа к необработанному потоку или перехода в parse_qs.В Django или Flask вы можете получить его через request.POST, который является словарем;просматривая документы Falcon, похоже, что req.params может выполнять аналогичную работу, хотя вам, возможно, потребуется сначала установить для параметра auto_parse_form_urlencoded значение True.

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