如何为Python Azure存储SDK的blob_client.upload_blob设置客户端DNS超时?
解决Azure Blob存储Python SDK上传时DNS异常的客户端超时问题
你遇到的问题核心在于:upload_blob方法的timeout参数是服务端响应超时,仅控制客户端等待服务端处理请求的时间,无法覆盖DNS解析、TCP连接建立这类客户端网络层面的超时(默认90秒)。要设置更短的客户端超时,需要从底层HTTP传输层入手配置。
解决方案:自定义HTTP传输层的超时设置
Azure Python SDK底层依赖requests库处理HTTP请求,我们可以通过自定义requests.Session的超时参数,再将其传入BlobServiceClient的传输配置中,从而全局控制所有请求的客户端超时(包括DNS解析阶段)。
修改后的完整代码
from azure.core.exceptions import AzureError from azure.storage.blob import BlobServiceClient from azure.core.pipeline.transport import AzureRequestsTransport import requests # 定义Azure存储连接信息 connection_string = "DefaultEndpointsProtocol=https;AccountName=test;AccountKey=removed==;EndpointSuffix=core.windows.net" container_name = "containername" blob_name = "blobname" local_file_path = "c:/temp/test.txt" # 配置底层HTTP会话的超时:(连接超时, 读取超时),单位秒 # 连接超时包含DNS解析、TCP连接建立的时间 session = requests.Session() session.timeout = (5, 5) # 使用自定义会话创建传输层 transport = AzureRequestsTransport(session=session) # 创建带自定义传输的BlobServiceClient blob_service_client = BlobServiceClient.from_connection_string(connection_string, transport=transport) # 执行Blob上传的函数 def upload_blob_process(): try: with open(local_file_path, "rb") as data: blob_client = blob_service_client.get_blob_client(container_name, blob_name) # 这里的timeout参数仍可保留,作为服务端响应的额外阈值 blob_client.upload_blob(data, timeout=5) print("Blob上传成功!") except AzureError as e: print(f"Azure服务错误:{e}") except Exception as e: print(f"发生未知错误:{e}") upload_blob_process()
关键说明
session.timeout = (5,5):第一个值是连接超时(控制DNS解析、TCP握手的最长时间),第二个值是读取超时(控制客户端等待服务端返回数据的最长时间),两者都设为5秒即可满足你的需求。- 该配置全局生效,所有通过此
BlobServiceClient发起的请求(包括获取Blob客户端、上传、下载等)都会使用这个超时设置。 - 原
upload_blob的timeout参数可保留,它作为服务端处理请求的超时阈值,和客户端超时形成双重保障。
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

