Neu*_*ann 9 python http urllib3 python-3.x python-requests
我正在使用requests(它使用urllib3引擎盖下的 Python http 模块)库从 Python 脚本上传文件。我的后端首先检查请求的标头,如果它不符合所需的先决条件,它会立即停止请求并以有效的 400 响应进行响应。
这种行为在 Postman 或 Curl 中运行良好;即客户端能够解析 400 响应,即使它没有完成上传并且服务器过早地响应。但是,在 Python 中使用requests/执行此操作时urllib3,库无法处理后端响应:
Traceback (most recent call last):
File "C:\Users\Neumann\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\urllib3\connectionpool.py", line 670, in urlopen
httplib_response = self._make_request(
File "C:\Users\Neumann\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\urllib3\connectionpool.py", line 392, in _make_request
conn.request(method, url, **httplib_request_kw)
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.1776.0_x64__qbz5n2kfra8p0\lib\http\client.py", line 1255, in request
self._send_request(method, url, body, headers, encode_chunked)
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.1776.0_x64__qbz5n2kfra8p0\lib\http\client.py", line 1301, in _send_request
self.endheaders(body, encode_chunked=encode_chunked)
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.1776.0_x64__qbz5n2kfra8p0\lib\http\client.py", line 1250, in endheaders
self._send_output(message_body, encode_chunked=encode_chunked)
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.1776.0_x64__qbz5n2kfra8p0\lib\http\client.py", line 1049, in _send_output
self.send(chunk)
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.1776.0_x64__qbz5n2kfra8p0\lib\http\client.py", line 971, in send
self.sock.sendall(data)
ConnectionResetError: [WinError 10054] Une connexion existante a dû être fermée par l’hôte distant
Run Code Online (Sandbox Code Playgroud)
因为服务器在传输完成之前应答,它错误地认为连接已中止,即使服务器确实返回了有效响应。
有没有办法避免这种情况并解析响应?
重现问题的步骤:
export MINIO_ACCESS_KEY=<access_key>
export MINIO_SECRET_KEY=<secret_key>
.\minio.exe server <data folder>
Run Code Online (Sandbox Code Playgroud)
import os
import sys
import requests
from requests_toolbelt.multipart.encoder import MultipartEncoder
def fatal(msg):
print(msg)
sys.exit(1)
def upload_file():
mp_encoder = MultipartEncoder(fields={'file': (open('E:/Downloads/kek.mp3', 'rb'))})
headers = { "Authorization": "invalid" }
print('Uploading file with headers : ' + str(headers))
upload_endpoint = 'http://localhost:9000/mybucket/myobject'
try:
r = requests.put(upload_endpoint, headers=headers, data=mp_encoder, verify=False)
except requests.exceptions.ConnectionError as e:
print(e.status)
for property, value in vars(e).items():
print(property, ":", value)
fatal(str(e))
if r.status_code != 201:
for property, value in vars(r).items():
print(property, ":", value)
fatal('Error while uploading file. Status ' + str(r.status_code))
print('Upload successfully completed')
if __name__ == "__main__":
upload_file()
Run Code Online (Sandbox Code Playgroud)
如果您使用此更改请求行,它将起作用(即服务器返回 400 并且客户端能够解析它):
r = requests.put(upload_endpoint, headers=headers, data='a string', verify=False)
Run Code Online (Sandbox Code Playgroud)
编辑:我更新了追踪,改变了问题的标题,以反映的事实,它既不requests或urllib3错,但所使用的两者的Python的HTTP模块。
| 归档时间: |
|
| 查看次数: |
451 次 |
| 最近记录: |