Python请求POST进行GET?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python请求POST进行GET?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3547字,纯文字阅读大概需要6分钟。
内容图文
我正在使用Python 2.7.5,Django 1.7,请求2.4.1,并进行一些简单的测试.但是,似乎当我调用requests.post时,该方法正在执行GET.
我的代码,与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请求库没有任何问题,所以我不确定我是否遗漏了一些明显的东西或者是否(使用较新版本的Django / 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,
退到方法的最后,实际发出请求,我的“准备”是一个POST,但我的resp是一个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.
解决方法:
要明确的是,每当请求收到重定向(具有某个status code)时,我们必须对请求执行某些转换.
在这种情况下,当您看到非常意外的情况时,最好的调试技巧是重试您的请求,但使用allow_redirects = False.这将立即返回30x响应.或者,您也可以检查r.history以查看是否有任何30x响应被遵循.在这种情况下,你可能会看到类似的东西
>>> r.request.method
'GET'
>>> r.history
[<Response [302]>,]
>>> r.history[0].request.method
'POST'
我们知道这样做可能会导致用户意外行为(就像它对你做的那样),但这是在网络上运行的唯一正确方法.
我希望这可以帮助您理解为什么这发生在它是重定向的事实之外,并且希望它能够为您和其他人提供将来调试它的工具.
内容总结
以上是互联网集市为您收集整理的Python请求POST进行GET?全部内容,希望文章能够帮你解决Python请求POST进行GET?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。