From 9460f0eca53c159782235a626942ea12d1a4d4ec Mon Sep 17 00:00:00 2001 From: yuniszhang Date: Mon, 8 Nov 2021 20:57:29 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E8=A7=A3=E5=86=B3get=5Fauth=E5=B9=B6?= =?UTF-8?q?=E5=8F=91=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- qcloud_cos/cos_client.py | 8 ++++++++ ut/test.py | 3 --- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/qcloud_cos/cos_client.py b/qcloud_cos/cos_client.py index b1ac4ea6..5fe6c444 100644 --- a/qcloud_cos/cos_client.py +++ b/qcloud_cos/cos_client.py @@ -240,6 +240,14 @@ def get_auth(self, Method, Bucket, Key, Expired=300, Headers={}, Params={}, Sign ) print (auth_string) """ + + # 解决一个没有搞懂的问题:如果保持参数Headers={},那么实测会发现两个线程的Headers指向同一个内存地址, + # request.headers=Headers,后续会用request.headers来保存Authorization值,在多线程并发时就会出现Authorization值被其它线程改写 + if not Headers: + Headers = dict() # 重新生成实例,避免Request通过{}复用内存 + if not Params: + Params = dict() # 重新生成实例,避免Request通过{}复用内存 + url = self._conf.uri(bucket=Bucket, path=Key) r = Request(Method, url, headers=Headers, params=Params) auth = CosS3Auth(self._conf, Key, Params, Expired, SignHost) diff --git a/ut/test.py b/ut/test.py index d3ee82f9..8a9d4513 100644 --- a/ut/test.py +++ b/ut/test.py @@ -6,9 +6,6 @@ import os import requests import json - -from requests.models import Response - import base64 from qcloud_cos import CosS3Client From a62156c3cd3bd0fea325604c010e995abb9261c3 Mon Sep 17 00:00:00 2001 From: yuniszhang Date: Mon, 8 Nov 2021 21:21:58 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E8=A7=A3=E5=86=B3get=5Fauth=E5=B9=B6?= =?UTF-8?q?=E5=8F=91=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- qcloud_cos/cos_client.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/qcloud_cos/cos_client.py b/qcloud_cos/cos_client.py index 5fe6c444..6ce70155 100644 --- a/qcloud_cos/cos_client.py +++ b/qcloud_cos/cos_client.py @@ -241,12 +241,13 @@ def get_auth(self, Method, Bucket, Key, Expired=300, Headers={}, Params={}, Sign print (auth_string) """ - # 解决一个没有搞懂的问题:如果保持参数Headers={},那么实测会发现两个线程的Headers指向同一个内存地址, + # python中默认参数只会初始化一次,而Headers={}是一个字典会传址(非传值),那么多个线程的Headers指向同一个内存地址, # request.headers=Headers,后续会用request.headers来保存Authorization值,在多线程并发时就会出现Authorization值被其它线程改写 + # 所以这里判断当Headers={}时重新生成实例,避免默认参数实例复用,导致多线程访问问题 if not Headers: - Headers = dict() # 重新生成实例,避免Request通过{}复用内存 + Headers = dict() if not Params: - Params = dict() # 重新生成实例,避免Request通过{}复用内存 + Params = dict() url = self._conf.uri(bucket=Bucket, path=Key) r = Request(Method, url, headers=Headers, params=Params) From 3aad55428a11b2e4a59ed17be9035b000bca74f1 Mon Sep 17 00:00:00 2001 From: yuniszhang Date: Mon, 8 Nov 2021 21:29:30 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E8=A7=A3=E5=86=B3get=5Fauth=E5=B9=B6?= =?UTF-8?q?=E5=8F=91=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- qcloud_cos/cos_client.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/qcloud_cos/cos_client.py b/qcloud_cos/cos_client.py index 6ce70155..4e5df888 100644 --- a/qcloud_cos/cos_client.py +++ b/qcloud_cos/cos_client.py @@ -245,9 +245,9 @@ def get_auth(self, Method, Bucket, Key, Expired=300, Headers={}, Params={}, Sign # request.headers=Headers,后续会用request.headers来保存Authorization值,在多线程并发时就会出现Authorization值被其它线程改写 # 所以这里判断当Headers={}时重新生成实例,避免默认参数实例复用,导致多线程访问问题 if not Headers: - Headers = dict() + Headers = dict() if not Params: - Params = dict() + Params = dict() url = self._conf.uri(bucket=Bucket, path=Key) r = Request(Method, url, headers=Headers, params=Params) From c679949f566f112da0febfadaa50336996d02f9d Mon Sep 17 00:00:00 2001 From: yuniszhang Date: Mon, 8 Nov 2021 21:52:24 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E8=A7=A3=E5=86=B3get=5Fauth=E5=B9=B6?= =?UTF-8?q?=E5=8F=91=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- qcloud_cos/cos_client.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/qcloud_cos/cos_client.py b/qcloud_cos/cos_client.py index 4e5df888..590f8c3e 100644 --- a/qcloud_cos/cos_client.py +++ b/qcloud_cos/cos_client.py @@ -241,9 +241,7 @@ def get_auth(self, Method, Bucket, Key, Expired=300, Headers={}, Params={}, Sign print (auth_string) """ - # python中默认参数只会初始化一次,而Headers={}是一个字典会传址(非传值),那么多个线程的Headers指向同一个内存地址, - # request.headers=Headers,后续会用request.headers来保存Authorization值,在多线程并发时就会出现Authorization值被其它线程改写 - # 所以这里判断当Headers={}时重新生成实例,避免默认参数实例复用,导致多线程访问问题 + # python中默认参数只会初始化一次,这里重新生成可变对象实例避免多线程访问问题 if not Headers: Headers = dict() if not Params: