我使用 $。fileDownload 从客户端向服务器( Python )发送数据。 API会接收数据,但作为 jQuery fileDownload docs 状态,数据将使用$ .param 进行序列化。问题是我需要使用 JSON格式的数据,以便可以处理它并使用 key:value对创建文件。我一直在试图弄清楚这一点,但是似乎似乎什么都没做,以“反序列化” 。似乎我也无法使 $。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)或已经是一个key = value参数字符串
编辑:
在我的 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(data)输出:
b'name =优先级+规则和行%5B0%5D%5BSegment%5D = HH + wo + TV&rows5B0%5D%5BValue%5D = 6&rows%5B0%5D%5BCampaignType%5D = CampaignType%3F&rows%5B0%5D %5BCampaignSubtype%5D =预定义+合同和行%5B0%5D%5BChannel%5D = WIND + STORE&rows%5B0%5D%5BPriority%5D = 1&rows%5B1%5D%5BSegment%5D = HH + wo + TV&rows%5B1%5D %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 = 2'
答案 0 :(得分:0)
这是表单编码的数据,您可以使用urllib.parse.parse_qs
在Python中进行解析。
>>> 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。