Python请求模块未使用post方法
我正在尝试将表单数据发布到URL。我没有得到预期的响应,并且对从请求模块(2.6.2)获得的一些信息感到好奇。以下是post方法:Python请求模块未使用post方法,python,forms,http,python-requests,python-3.3,Python,Forms,Http,Python Requests,Python 3.3,我正在尝试将表单数据发布到URL。我没有得到预期的响应,并且对从请求模块(2.6.2)获得的一些信息感到好奇。以下是post方法: >>> response = requests.post(url, data={'uname':user, 'pwd':password,'phrase':'','submit':True}) 正如您所看到的,我正在使用post()方法,因此我希望该方法是post。数据对象的键与表单元素的名称匹配。URL是表单操作 >>> va
>>> response = requests.post(url, data={'uname':user, 'pwd':password,'phrase':'','submit':True})
正如您所看到的,我正在使用post()
方法,因此我希望该方法是post
。数据
对象的键与表单元素的名称匹配。URL是表单操作
>>> vars(response.request)
{'method': 'GET', 'body': None, '_cookies': <<class 'requests.cookies.RequestsCookieJar'>[]>, 'headers': {'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Content-Type': 'application/x-www-form-urlencoded', 'User-Agent': 'python-requests/2.6.2 CPython/3.3.6 Windows/8', 'Connection': 'keep-alive'}, 'hooks': {'response': []}, 'url': url}
那些看起来不错,只是,等一下!我的表格数据在哪里?为什么不随请求一起发送?我检查了历史记录,发现我被重定向了。这次我将allow\u redirects=False
添加到我的post()
调用中。然后检查response.request
对象及其标题
>>> vars(response.request)
{'method': 'POST', 'body': 'phrase=&pwd=****&uname=****&submit=True', '_cookies': <<class 'requests.cookies.RequestsCookieJar'>[]>, 'headers': {'Accept-Encoding': 'gzip, deflate', 'Content-Type': 'application/x-www-form-urlencoded', 'User-Agent': 'python-requests/2.6.2 CPython/3.3.6 Windows/8', 'Content-Length': '56', 'Accept': '*/*', 'Connection': 'keep-alive'}, 'hooks': {'response': []}, 'url': 'http://myurl.com/path/to/script.php'}
这些标题中同样没有表单数据。这是什么<代码>'Content-Type':'application/x-www-form-urlencoded'?这就是我的表单数据看起来像查询字符串的原因吗?正常的内容类型是什么?它的类型与Chrome在同一个URL上报告的类型相同,所以我怀疑这是问题所在
如果这些都没有引起注意,他们可能会聪明地拒绝来自非本地的帖子,对吗?我主要关心的是表单数据是body
属性中的字符串,这似乎是错误的。如果没有,我可以聪明地设置HTTP头的来源吗
'application/x-www-form-urlencoded'
这是发布数据时的最佳选择
是的,如果您的POST数据看起来像一个查询字符串,这也没关系,这就是使用x-www-form-urlencoded
发送它的方式。从上一链接:
控件名称/值按它们在文档中的显示顺序列出。名称与值之间用=
分隔,名称/值对之间用&
分隔
下一步:
这些标题中同样没有表单数据
对于POST,表单数据不会在标题中发送。它在请求正文中发送。试一试
>>> response.request.body
'uname=x&pwd=y&submit=True&phrase='
要查看此数据我尝试使用
.post(headers={'origin':…,'host':…,…})
对标题进行欺骗,但没有任何区别。因此,您似乎在说一切看起来都是正确的。也许我的问题是,结果是保存我在会话cookie中寻找的内容。我试图在post()
前面加上session=requests.session()
以捕获这些请求。您是否建议使用更新问题以确定如何检索这些会话Cookie?当服务器希望客户端保存Cookie时,它将使用HTTP头设置Cookie
进行响应。您可以通过使用response.headers['set-cookie']
捕获这个cookie数据。好吧,肯定有什么事情发生在别处,因为我从这里得到的响应是302重定向。如果凭证被接受,它将是一个不同的页面,但它会将我返回到表单URL。我期望set cookie
标题,但我没有得到它。我也没有收到关于不正确凭据的预期消息,因此它不能接受我的帖子数据。我感谢您的回答,并考虑它已经解决了我的问题,即使我仍然滞留一个未知的问题。如果您是302重定向到不正确的页面,我建议访问该页面与谷歌浏览器,并打开网络工具页(CTRL+Shift +J,然后点击“网络”选项卡)。在这里,您将看到浏览器发送的确切POST参数,您应该能够用Python模拟此请求,没有问题。您是对的,我正在使用GET请求重定向。我的问题是,在Chrome上的重定向中有一个set cookie
头来存储uname
和会话cookie中pwd
值的变异。据我所知,我正在模仿所描述的请求。我在获取这些会话cookie时遇到了问题,但如果凭据得到验证,我也不会被重定向到预期的位置。显然,是我做错了什么。
'application/x-www-form-urlencoded'
>>> response.request.body
'uname=x&pwd=y&submit=True&phrase='