您的位置:

为什么UnrewindableBodyError("Unable to record file position for rewinding ""request body during a redirect/retry."),怎么解决

  发布时间:2023-01-24 07:30:01
报错的原因是urllib库中的一种错误,通常是由于在重定向或重试请求时,请求体的文件位置无法记录而产生的。也可以使用urllib的重定向策略中的来解决该问题。使用io.BytesIO或io.StringIO对象包装请求体,这些对象都支持“.seek()”和“.tell()”操作。

报错的原因

"UnrewindableBodyError"是urllib3库中的一种错误,通常是由于在重定向或重试请求时,请求体的文件位置无法记录而产生的。这可能是因为请求体不是真正的文件对象,而是一种类文件对象,例如StringIO或BytesIO对象,或者是一个真正的文件对象但没有支持“.seek()”或“.tell()”操作。

如果您在重定向或重试请求时遇到此错误,则可能需要更改您的代码,使用真正的文件对象作为请求体,或者将其包装在可重复使用的对象中,例如io.BytesIO。

也可以使用urllib3的重定向策略中的“FALLBACK_REDIRECT_MANAGER”来解决该问题。

如何解决

可以使用以下方法来解决这个问题:

1. 使用真正的文件对象作为请求体,并确保该对象支持“.seek()”和“.tell()”操作。

2. 使用io.BytesIO或io.StringIO对象包装请求体,这些对象都支持“.seek()”和“.tell()”操作。

3. 使用urllib3的重定向策略中的“FALLBACK_REDIRECT_MANAGER”来解决该问题

例如


from urllib3.util import Retry
from urllib3.util.retry import Retry
from urllib3.util.retry import Retry
from urllib3.util.retry import Retry
from urllib3.util.retry import Retry
from urllib3 import Retry

session = requests.Session()
retry = Retry(total=5,
              backoff_factor=0.1,
              status_forcelist=[ 500, 502, 503, 504 ],
              method_whitelist=["HEAD", "TRACE", "GET", "PUT", "OPTIONS", "DELETE"],
              redirect_backoff_factor=0.1
             )

adapter = HTTPAdapter(max_retries=retry, redirect_policy=FALLBACK_REDIRECT_MANAGER)
session.mount("http://", adapter)
session.mount("https://", adapter)

这样就可以避免出现"UnrewindableBodyError"的问题了。

使用例子

是的,举个例子:

假设你要发起一个POST请求,请求的数据是一个字符串,那么使用io.StringIO来包装这个字符串就能避免出现“UnrewindableBodyError”错误。


import io
import requests

data = "Hello, World!"

s = io.StringIO(data)

r = requests.post("https://httpbin.org/post", data=s)
print(r.text)

如果你需要上传文件, 使用io.BytesIO来包装你的文件,例如:


import io
import requests

file = open("file.txt", "rb")
b = io.BytesIO(file.read())
file.close()

r = requests.post("https://httpbin.org/post", files={"file": b})
print(r.text)

或者你可以使用urllib3的重定向策略中的“FALLBACK_REDIRECT_MANAGER”来解决该问题,详细使用方法请参考上面的代码。

请注意,这只是一种可能的解决方案,如果仍然存在问题,请尝试其他解决方法。