Python 如何调试请求库?

Python 如何调试请求库?,python,curl,python-requests,Python,Curl,Python Requests,我正在尝试将python脚本从通过os.system()发出curl命令转换为使用请求。我本以为我会用pycurl,但却说服了我。问题是我从服务器返回了一个错误,在使用r.text()时可以看到这个错误,但我需要更多信息。有没有更好的方法来调试正在发生的事情 值得一提的是,我认为问题在于如何将我的--data标志从curl/pycurl转换为请求。我已经创建了一个我要传递给的参数的字典——以前的数据。我的猜测是,其中之一是无效的,但我如何才能得到更多的信息来确定 例如: headers2 = {

我正在尝试将python脚本从通过
os.system()
发出curl命令转换为使用请求。我本以为我会用pycurl,但却说服了我。问题是我从服务器返回了一个错误,在使用r.text()时可以看到这个错误,但我需要更多信息。有没有更好的方法来调试正在发生的事情

值得一提的是,我认为问题在于如何将我的--data标志从curl/pycurl转换为请求。我已经创建了一个我要传递给的参数的字典——以前的数据。我的猜测是,其中之一是无效的,但我如何才能得到更多的信息来确定

例如:

headers2 = {"Accept":"*/*", \
"Content-Type":"application/x-www-form-urlencoded", \
"User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36", \
"Origin":"https://somedomain.com", \
"X-Requested-With":"XMLHttpRequest", \
"Connection":"keep-alive", \
"Accept-Language":"en-US,en;q=0.8", \
"Referer":"https://somedomain.com/release_cr_new.html?releaseid=%s&v=2&m=a&prev_release_id=%s" % (current_release_id, previous_release_id), \
"Host":"somedomain.com", \
"Accept-Encoding":"gzip,deflate,sdch", \
"Cookie":'cookie_val'}

for bug_id in ids:
  print bug_id
  data = {'dump_json':'1','releaseid':current_release_id, 'v':'2','m':'a','prev_release_id': previous_release_id,'bug_ids': bug_id, 'set_cols':'sqa_status&sqa_updates%5B0%5D%5Bbugid%5D=' + bug_id + '&sqa_updates%5B0%5D%5Bsqa_status%5D=6'}
  print 'current_release_id' , data['releaseid']
  print 'previous_release_id', data['prev_release_id']
  r = requests.post(post_url, data=json.dumps(data), headers=headers2)
  print r.text
我得到的输出是一条非常通用的html消息,我以前在以错误的方式查询服务器时看到过这条消息。所以我知道我至少找到了正确的服务器

我真的不希望有任何结果。这应该只发送到服务器并更新数据库中的一个字段。

http响应的剖析 示例(加载此页面)

标题: 身体 使用
r.text

请求后编码 在请求中发送到服务器的“内容类型”应与实际发送的内容类型匹配。在您的例子中,您发送的是json,但告诉服务器您正在发送表单数据(如果没有指定,这是默认值)

从上面显示的标题中:

“内容类型”:“应用程序/x-www-form-urlencoded”,

但是您的request.post调用设置了
data=json.dumps(data)
,即json。标题应该是:


“内容类型”:“application/json”,

请求
对象返回的值包含
.request
下的请求信息

例如:

r = requests.request("POST", url, ...)

print("Request headers:", r.request.headers)
print("Request body:", r.request.body)

print("Response status code:", r.status_code)
print("Response text:", r.text.encode('utf8'))

你能举个例子(包括输入、预期输出和实际输出)吗?您可以指向(如果您不想将数据发送到github,您可以在github上分叉)。这可能有助于调试差异。我尝试用一个示例更新它。一开始我犹豫是否这样做,因为我“众所周知,我不善于留下一些我应该掩盖的东西。我在编码方面做了一些尝试——完全删除它,结果没有任何变化。这太棒了!所以,我只是盲目地复制了
json.dumps
片段。表单URLCoded是正确的编码类型。我将此更改为
data=data
,现在的响应似乎更准确,但并没有达到我的预期。我会接受这个答案,做更多的挖掘。
>>> bad_r = requests.get('http://httpbin.org/status/404')
>>> bad_r.status_code
404

>>> bad_r.raise_for_status()
Traceback (most recent call last):
  File "requests/models.py", line 832, in raise_for_status
    raise http_error
requests.exceptions.HTTPError: 404 Client Error
r = requests.get('http://en.wikipedia.org/wiki/Monty_Python')
# response headers: 
r.headers
# request headers:
r.request.headers
r = requests.request("POST", url, ...)

print("Request headers:", r.request.headers)
print("Request body:", r.request.body)

print("Response status code:", r.status_code)
print("Response text:", r.text.encode('utf8'))