如何在Python中使用urllib2发布本地文件?

时间:2014-05-15 20:36:55

标签: python curl urllib2

我是一个完整的Python菜鸟,我正在尝试使用urllib2运行cURL等价物。我想要的是一个Python脚本,在运行时,它将与终端中的以下cURL命令完全相同:

curl -k -F docfile=@myLocalFile.csv http://myWebsite.com/extension/extension/extension

我在教程页面上找到了以下模板:

import urllib
import urllib2


url = "https://uploadWebsiteHere.com"
data = "{From: 'sender@email.com', To: 'recipient@email.com', Subject:   'Postmark test', HtmlBody: 'Hello dear Postmark user.'}"
headers = { "Accept" : "application/json",
        "Conthent-Type": "application/json",
        "X-Postmark-Server-Token": "abcdef-1234-46cc-b2ab-38e3a208ab2b"}
req = urllib2.Request(url, data, headers)
response = urllib2.urlopen(req)
the_page = response.read()

但我完全迷失在'数据'和'标题'变量上。 urllib2文档(https://docs.python.org/2/library/urllib2.html)将“数据”输入定义为“指定要发送到服务器的其他数据的字符串”,将“标题”输入定义为“字典”。我完全没有深入尝试遵循这个文档,并且当我只能通过指定文件和URL在终端中完成同样的任务时,我不明白为什么需要字典。好吗?

2 个答案:

答案 0 :(得分:1)

您发布的数据似乎不是有效的JSON。假设服务器期望有效的JSON,您应该更改它。

您的curl调用未传递任何可选标头,因此您不需要在请求中提供更多内容。如果要验证确切的标头,可以将-vi添加到curl调用,并在Python代码中直接匹配它们。或者,这对我有用:

import urllib2

url = "http://localhost:8888/"
data = '{"From": "sender@email.com", "To": "recipient@email.com", "Subject": "Postmark test", "HtmlBody": "Hello dear Postmark user."}'
headers = {
    "Content-Type": "application/json"
}
req = urllib2.Request(url, data, headers)
response = urllib2.urlopen(req)
the_page = response.read()

切换到使用requests可能符合您的最佳利益,但对于这个简单的事情,可以使标准库urllib2起作用。

答案 1 :(得分:1)

  

我想要的是一个Python脚本,在运行时,它将与终端中的以下cURL命令完全相同:

$ curl -k -F docfile=@myLocalFile.csv https://myWebsite.com/extension...

curl -F使用multipart/form-data内容类型发送文件。您可以使用requests库轻松地重现它:

import requests # $ pip install requests

with open('myLocalFile.csv','rb') as input_file:
    r = requests.post('https://myWebsite.com/extension/...', 
                      files={'docfile': input_file}, verify=False)

verify=False将效仿curl -k