如何使用PyCurl发送POST参数?

时间:2019-06-10 16:56:18

标签: python python-3.x post pycurl

我正在使用Python 3.7。我正在尝试使用PyCurl发出CURL POST请求,但是在弄清楚如何组装表单参数时遇到了麻烦。我尝试过了

conn = pycurl.Curl()
if python3:
    conn.setopt(conn.CAINFO, certifi.where())
conn.setopt(conn.URL, str(SEARCH_URL))
send = [("MAX_FILE_SIZE", 10485760),
        ('url', image_url),
        ('search', 'search'),
        ('nsfwfilter', 'on'),]
conn.setopt(pycurl.HTTPPOST, send)
conn.setopt(conn.FOLLOWLOCATION, 1)
conn.setopt(conn.USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0')
conn.setopt(conn.WRITEFUNCTION, returned_code.write)
conn.perform()
conn.close()

这死于错误

  File "/Users/davea/Documents/workspace/myproject_project/myproject/services/media_service.py", line 71, in doImageSearch
    conn.setopt(pycurl.HTTPPOST, send)
TypeError: unsupported second type in tuple

如何正确格式化参数?

1 个答案:

答案 0 :(得分:0)

我根据错误消息和预感发表了评论(我想 MAX_FILE_SIZE 是请求的 HTTP标头之一),也没有对其进行测试,但显然我是正确的。我曾尝试寻找官方文件来支持我的陈述,但运气并不好。
我搜索了[PycURL]: Curl Object setopt(option, value) → None,在这里找到了:

  

可以通过直接使用选项常量的数值来设置PycURL不知道的整数选项-并且只能设置它们。例如,pycurl.VERBOSE的值为42,并且可以设置如下:

c.setopt(42, 1)

,但这不是我期望的。然后,进一步:[Haxx.curl]: CURLOPT_HTTPPOST explained,但是它也不包含很多有用的信息。
唯一与远程相关的地方是邮件线程:[Haxx.curl]: Difficulty uploading files via http

无论如何,将 MAX_FILE_SIZE 的“参数”设置为字符串,可以达到目的:

send = [
    ("MAX_FILE_SIZE", "10485760"),  # Notice the quotes
    ("url", image_url),
    ("search", "search"),
    ("nsfwfilter", "on"),
]