如何在Python请求中更改表单编码?

时间:2017-09-21 16:06:45

标签: python encoding python-requests

我有一个西里尔字符串,我希望使用Python请求以Windows-1251编码的形式发送。

看一下这个例子:

import requests
st = 'Искать'
requests.post('http://localhost:8888', data={'test': st})

但是,请求的数据变为此(运行nc -l 8888以查看请求):

test=%D0%98%D1%81%D0%BA%D0%B0%D1%82%D1%8C

这是我的目标字符串,编码为UTF-8,我们可以轻松检查:

>>> from urllib.parse import quote
>>> st = 'Искать'
>>> quote(st, encoding='utf-8')  # Matches
'%D0%98%D1%81%D0%BA%D0%B0%D1%82%D1%8C'
>>> quote(st, encoding='cp1251')  # Doesn't match
'%C8%F1%EA%E0%F2%FC'

现在我想如果我自己编码数据,那就可以了。

requests.post('http://localhost:8888', data={'test': quote(st, encoding='cp1251')})

但事实证明情况并非如此,因为在字母编码时,百分号再次编码为UTF-8(%25),整个字符串再次无效

test=%25C8%25F1%25EA%25E0%25F2%25FC

所以我正在寻找一种方法来禁用内置的请求编码功能或覆盖编码值。我该怎么办?

我正在使用Python 3.5,请求2.18.4

1 个答案:

答案 0 :(得分:0)

来自docs.python-requests

  

有时您可能希望发送非表单编码的数据。如果传入字符串而不是dict,则会直接发布该数据。

因此,如果您不希望数据进行表单编码,则应使用字符串。

st = 'Искать'
data={'test': quote(st, encoding='cp1251')}
data = '&'.join('='.join(i) for i in data.items())
requests.post('http://localhost:8888', data=data)