Python请求POST以形成记录不正确的有效负载(复选框)

时间:2015-12-02 20:07:40

标签: python sqlite post webforms python-requests

通过POST with Requests(2.8.1)模块将正确的表单数据保存到服务器上,我遇到了一些麻烦。

我之前的代码完全符合我的要求:它将一堆key:value对编码为正确的header:value有效负载dict格式,并成功发送到URI。我得到了200响应(我正在寻找的),一切都很棒。

这是OLD有效负载编码功能的一部分,为简洁省略了大量key:value对。

注意:复选框值集可以是1到25之间的任何数字序列,我只是将其写为

  

范围内的项目(1,5)

说明该列表由int数组成,即[ "", 1, 2, 3, 4, 5,...][ "", 2, 7, 5, 1, 25,...]等。

checkboxList = ["",]
for item in range(1,5):
    checkboxList.append(item)
payload['checkbox[ids][]'] = checkboxList
...
response = request.post(data_url, data=payload)
>> 200 OK!

下面是有效负载dict(复选框)在发送到服务器之前的样子的打印:

  

{...“复选框[ids] []”:[“”,2,17,20,5,...}

当我用浏览器查看页面时,所有有效负载信息都已正确记录(上面省略)和复选框(如上所示)是正确的!

最初,复选框值来自excel文件,在发送到服务器之前放入有效内容的其他信息也是如此。但是,现在我正在从SQLite数据库中检索信息。

以下是错误地记录复选框的新代码。我应该注意:我无法访问服务器,因此我无法轻易判断它是否是服务器问题,但我们假设它不是服务器故障。我以前遇到过这个问题,但是我让它使用上面的代码。但是,既然我已经开始在数据库中存储我需要的值,我就无法获得服务器记录的正确复选框。

这就是db列中的数据:

  

12-5-1-22-4

(...我知道这不是DB mgmt的好习惯,但我认为这不是POST记录错误数据的原因,我希望这个问题尽可能地代表我的代码。 。)

checkList = checkboxesFromDB.split('-')
payload['checkbox[ids][]'] = checkList
...
response = request.post(data_url, data=payload)
>> 200 OK!

当我使用浏览器查看网站时,它会错误地记录复选框。现在,我应该注意,无论我传递给payload[checkbox[ids][]]

,都会选择3个复选框

即使我从有效负载字典中完全省略checkbox[ids][],它也总是相同的3个不正确的复选框。知道了,我们可以假设它是一个服务器问题。但是,上面几乎完全相同的代码可以工作(当我从excel文件中获取信息时)。

我尝试了以下内容(只有一个值作为测试),但未获得服务器记录的正确复选框:

payload['checkbox[ids][]'] = '1'
payload['checkbox[ids][]'] = 1
payload['checkbox[ids][]'] = [1]
payload['checkbox[ids][]'] = ["",1]
payload['checkbox[ids][]'] = [1,""]

将图像上传到同一台服务器时,从数据库中检索图像BLOB并尝试将缓冲区对象作为文件直接传递给Requests时出现编码问题,但我使用cStringIO编码修复了此问题。 (我花了很长时间,因为我对编程很陌生,而且还不确定语法,更不用说处理这类东西的方法......)我想我可能会遇到类似的编码问题,但测试和研究我已经完成了,我不能确定任何一种方式,因为我觉得我有点过头了。

如果这完全是NOOB我很抱歉,但我做了大量的研究,尝试了很多我能想到的不同的事情。我尝试传递字符串,列表,dicts,强制列表编码为utf-8。

我很困惑的主要原因是我的原始代码WORKS,我的新代码几乎相同但没有。我能想到的唯一真正的区别是现在我的信息来自一个SQLite数据库(这个特定的复选框列是TEXT类型)

任何人都可以帮助我,或者指出我没有想到/知道的新方向吗?

1 个答案:

答案 0 :(得分:0)

我浏览了所有payload对,发现这是HTML的问题。

我在我的SQLite数据库中保存HTML(通过BeautifulSoup而不会美化它)为TEXT。然后我正在检索它并将其作为字符串发送。这就是抛弃服务器响应。

我已经将该sql列值类型交换为VARCHAR(最适合我使用)并在保存到db之前将其作为此foo = bar.prettify(formatter="html")进行美化。现在,当我检索该值并将其传递给payload时,一切正常。