如何使Python请求遵循POST重定向?

如何使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

使用以下代码,服务器响应301重定向,但客户端将POST更改为GET,这是无用的行为,因为GET端点不存在。使用CURL-L-X POST可以正常工作。使用python2和python3以及Raspbian的几个版本时,此行为是相同的

>>> 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