我使用的是Python 2.7.5、Django 1.7和requests 2.4.1,正在进行一些简单的测试。但是,当我调用requests.post时,该方法似乎会执行GET操作。
我的代码与RESTful API通信。请注意,使用此有效载荷和端点,POST命令可通过Hurl.it正常工作:
这是怎么翻转的?我之前使用Python requests库没有问题,所以我不确定是否漏掉了什么明显的东西或者(在Django / Requests新版本中)需要设置另一个参数?这是缓存问题吗?有没有调试技巧?我尝试重新安装requests,并将Django回滚到1.6.5版本,但没有任何作用…一定很简单。--谢谢!
====== 更新1 ========
这里只是汇总Martijn在这里建议的一些调试信息:
深入研究request()方法:
我的代码与RESTful API通信。请注意,使用此有效载荷和端点,POST命令可通过Hurl.it正常工作:
def add_dummy_objective(self):
"""
To the bank
"""
payload = {
'displayName': {
'text': self._test_objective
},
'description': {
'text': 'For testing of API Middleman'
},
'genusTypeId': 'DEFAULT'
}
obj_url = self.host + self.bank_id + '/objectives/?proxyname=' + self._admin_key
req = requests.post(obj_url, data=json.dumps(payload), headers=self.headers)
return req.json()
我正在将头部设置为 JSON:
self.headers = {
'Content-Type' : 'application/json'
}
与预期的POST不同,我获得了一份目标列表(这是我从GET中期望得到的)。使用pdb,我看到:
(Pdb) req.request
<PreparedRequest [GET]>
(Pdb) req.request.method
'GET'
这是怎么翻转的?我之前使用Python requests库没有问题,所以我不确定是否漏掉了什么明显的东西或者(在Django / Requests新版本中)需要设置另一个参数?这是缓存问题吗?有没有调试技巧?我尝试重新安装requests,并将Django回滚到1.6.5版本,但没有任何作用…一定很简单。--谢谢!
====== 更新1 ========
这里只是汇总Martijn在这里建议的一些调试信息:
(Pdb) requests.post.__name__
'post'
进入requests/api.py中的post()定义:
(Pdb) l
88 :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.
89 :param \*\*kwargs: Optional arguments that ``request`` takes.
90 """
91 import pdb
92 pdb.set_trace()
93 -> return request('post', url, data=data, **kwargs)
深入研究request()方法:
(Pdb) method
'post'
(Pdb) l
43 >>> req = requests.request('GET', 'http://httpbin.org/get')
44 <Response [200]>
45 """
46 import pdb
47 pdb.set_trace()
48 -> session = sessions.Session()
49 return session.request(method=method, url=url, **kwargs)
在session.request中再加一层:
(424)request()
-> method = builtin_str(method)
(Pdb) method
'post'
(Pdb) l
419 :param cert: (optional) if String, path to ssl client cert file (.pem).
420 If Tuple, ('cert', 'key') pair.
421 """
422 import pdb
423 pdb.set_trace()
424 -> method = builtin_str(method)
425
426 # Create the Request.
427 req = Request(
428 method = method.upper(),
429 url = url,
在方法的最后一步,请求实际被发起时,我的“prep”是POST请求,但我的响应却是GET请求:
(Pdb) prep
<PreparedRequest [POST]>
(Pdb) n
-> return resp
(Pdb) resp
<Response [200]>
(Pdb) resp.request
<PreparedRequest [GET]>
(Pdb) l
449 'allow_redirects': allow_redirects,
450 }
451 send_kwargs.update(settings)
452 resp = self.send(prep, **send_kwargs)
453
454 -> return resp
455
456 def get(self, url, **kwargs):
457 """Sends a GET request. Returns :class:`Response` object.
458
459 :param url: URL for the new :class:`Request` object.
requests.post = requests.get
。requests.post.__name__
会产生什么结果? - Martijn Pietersrequests.post
调用,使用l
检查周围的上下文,进一步深入并查看发送请求所使用的方法等。 - Martijn Pieters