如何使Python请求遵循POST重定向?
使用以下代码,服务器响应301重定向,但客户端将POST更改为GET,这是无用的行为,因为GET端点不存在。使用CURL-L-X POST可以正常工作。使用python2和python3以及Raspbian的几个版本时,此行为是相同的如何使Python请求遵循POST重定向?,python,redirect,post,python-requests,Python,Redirect,Post,Python Requests,使用以下代码,服务器响应301重定向,但客户端将POST更改为GET,这是无用的行为,因为GET端点不存在。使用CURL-L-X POST可以正常工作。使用python2和python3以及Raspbian的几个版本时,此行为是相同的 >>> import requests >>> url = "https://registry.micronets.in/mud/v1/register- device/DAWG/AgoNDQcDDgg/aabbccddeef
>>> import requests
>>> url = "https://registry.micronets.in/mud/v1/register-
device/DAWG/AgoNDQcDDgg/aabbccddeeffgg"
>>> response = requests.post(url)
>>> response
<Response [404]>
# Server Log: (Note - both endpoints, are on the same server using virtual hosts)
redirecting to: https://hotdawg.micronets.in/registry/devices/register- device/AgoNDQcDDgg/aabbccddeeffgg
POST /registry/v1/register-device/DAWG/AgoNDQcDDgg/aabbccddeeffgg 301 16.563 ms - 122
{
"status": 404
}
GET /vendors//register-device/AgoNDQcDDgg/aabbccddeeffgg 404 0.604 ms - 14
# CURL version (succeeds)
curl -L -X POST "https://registry.micronets.in/mud/v1/register-
device/DAWG/AgoNDQcDDgg/aabbccddeeffgg"
Device registered (insert): {
"model": "AgoNDQcDDgg",
"pubkey": "aabbccddeeffgg",
"timestamp": "2019-12-27 15:44:14 UTC",
"_id": "HBlQzXfBnoB3N4fN"
}
# Server Log: (from CURL)
redirecting to: https://hotdawg.micronets.in/registry/devices/register-
device/AgoNDQcDDgg/aabbccddeeffgg
POST /registry/v1/register-device/DAWG/AgoNDQcDDgg/aabbccddeeffgg 301 0.364 ms - 122
POST /vendors//register-device/AgoNDQcDDgg/aabbccddeeffgg 200 1.745 ms - 157
导入请求
>>>url=”https://registry.micronets.in/mud/v1/register-
设备/DAWG/AgoNDQcDDgg/aabbccddeeffgg”
>>>response=requests.post(url)
>>>回应
#服务器日志:(注意-两个端点使用虚拟主机位于同一服务器上)
重定向到:https://hotdawg.micronets.in/registry/devices/register- 设备/AgoNDQcDDgg/aabbccddeeffgg
POST/registry/v1/register device/DAWG/agondqcdgg/aabbccddeefgg 301 16.563 ms-122
{
“状态”:404
}
GET/vendors//注册设备/agondqcdgg/aabbccddeffgg 404 0.604 ms-14
#CURL版本(成功)
卷曲-L-X柱“https://registry.micronets.in/mud/v1/register-
设备/DAWG/AgoNDQcDDgg/aabbccddeeffgg”
已注册设备(插入):{
“型号”:“AgoNDQcDDgg”,
“公开密钥”:“aabbccddeffgg”,
“时间戳”:“2019-12-27 15:44:14 UTC”,
_id:“HBlQzXfBnoB3N4fN”
}
#服务器日志:(来自CURL)
重定向到:https://hotdawg.micronets.in/registry/devices/register-
设备/AgoNDQcDDgg/aabbccddeeffgg
POST/registry/v1/register device/DAWG/agondqcdgg/aabbccddeefgg 301 0.364 ms-122
POST/供应商//注册设备/AgoNDQcDDgg/aabbccddeeffgg 200 1.745 ms-157
检查您的
nginx
配置:
POST
请求,该请求已成功到达服务器POST
请求,并根据您分配的规则进行处理GET
请求调用end时出现的问题请求
没有处理重定向,但已经正确处理了重定向。但是您可以将它与使用它的curl
进行比较-L
,默认情况下,强制服务器推送请求。(等,curl--仅列出-X POST”https://registry.micronets.in/mud/v1/register-device/DAWG/AgoNDQcDDgg/aabbccddeeffgg“
)其中您正在使用-X
,它用于HTTP
通过HTTPS
url-X,--request将用于所有请求,例如,如果您使用-L,--location,当curl没有根据HTTP 30x响应代码更改请求方法时,可能会导致意外的副作用-以及类似的情况。
我宁愿接受更好的答案,但我计划如下解决此问题:
response = requests.post(url, allow_redirects=False)
if response.status_code == 301:
response = requests.post(response.headers['Location'])
或
您是否尝试过在
POST
请求中使用allow_redirects
标志来True
(我怀疑问题是重定向到另一个域(实际上是子域)。如果重定向到同一域上的不同端点,我推测POST重定向会成功)。如前所述,两个端点位于同一物理服务器上,使用nginx中的虚拟主机进行映射。因此,两个端点的IP地址都是sameaws_外观,我会尝试一下,但我了解到这是除了HEAD请求之外的默认行为。是的,刚刚尝试过,同样的行为@aԋ625;ҽԃαєιcαη如果服务器配置不正确,那么为什么curl-L-X POST
工作正常?@aԋ625;ҽαєιcαη来自服务器的301重定向只指定URL,而不是方法。当执行重定向时,客户端选择该方法。该方法仍然返回一个404
,并且不回答OP的问题此处的新功能是什么?调用标头位置。就这些吗?@aԋɱҽԃaєιcαη这里的新功能是它解决了我的问题。它还表明我的nginx配置没有任何问题
https://hotdawg.micronets.in/registry/devices/register-device/AgoNDQcDDgg/aabbccddeeffgg
[<Response [301]>] Moved Permanently
404 Not Found
<Response [200]>
response = requests.post(url, allow_redirects=False)
if response.status_code == 301:
response = requests.post(response.headers['Location'])
response = requests.post(url, allow_redirects=False)
i=10
while i > 0 and response.status_code == 301:
response = requests.post(response.headers['Location'], allow_redirects=False)
i -= 1