Skip to content

Commit 6f1fdd0

Browse files
committed
add .qiniu_pythonsdk_hostscache.json file ptah parameter and update fetch returns info
1 parent 1fde5f0 commit 6f1fdd0

File tree

4 files changed

+89
-69
lines changed

4 files changed

+89
-69
lines changed

qiniu/region.py

+29-22
Original file line numberDiff line numberDiff line change
@@ -22,37 +22,42 @@ def __init__(
2222
up_host_backup=None,
2323
io_host=None,
2424
host_cache={},
25-
scheme="http",
26-
home_dir=os.getcwd()):
25+
home_dir=None,
26+
scheme="http"):
2727
"""初始化Zone类"""
28-
self.up_host, self.up_host_backup, self.io_host = up_host, up_host_backup, io_host
28+
self.up_host, self.up_host_backup, self.io_host, self.home_dir = up_host, up_host_backup, io_host, home_dir
2929
self.host_cache = host_cache
3030
self.scheme = scheme
31-
self.home_dir = home_dir
3231

33-
def get_up_host_by_token(self, up_token):
32+
def get_up_host_by_token(self, up_token, home_dir):
3433
ak, bucket = self.unmarshal_up_token(up_token)
35-
up_hosts = self.get_up_host(ak, bucket)
34+
if home_dir is None:
35+
home_dir = os.getcwd()
36+
up_hosts = self.get_up_host(ak, bucket, home_dir)
3637
return up_hosts[0]
3738

38-
def get_up_host_backup_by_token(self, up_token):
39+
def get_up_host_backup_by_token(self, up_token, home_dir):
3940
ak, bucket = self.unmarshal_up_token(up_token)
40-
up_hosts = self.get_up_host(ak, bucket)
41+
if home_dir is None:
42+
home_dir = os.getcwd()
43+
up_hosts = self.get_up_host(ak, bucket, home_dir)
4144
if (len(up_hosts) <= 1):
4245
up_host = up_hosts[0]
4346
else:
4447
up_host = up_hosts[1]
4548
return up_host
4649

47-
def get_io_host(self, ak, bucket):
50+
def get_io_host(self, ak, bucket, home_dir):
4851
if self.io_host:
4952
return self.io_host
50-
bucket_hosts = self.get_bucket_hosts(ak, bucket)
53+
if home_dir is None:
54+
home_dir = os.getcwd()
55+
bucket_hosts = self.get_bucket_hosts(ak, bucket, home_dir)
5156
io_hosts = bucket_hosts['ioHosts']
5257
return io_hosts[0]
5358

54-
def get_up_host(self, ak, bucket):
55-
bucket_hosts = self.get_bucket_hosts(ak, bucket)
59+
def get_up_host(self, ak, bucket, home_dir):
60+
bucket_hosts = self.get_bucket_hosts(ak, bucket, home_dir)
5661
up_hosts = bucket_hosts['upHosts']
5762
return up_hosts
5863

@@ -74,10 +79,10 @@ def unmarshal_up_token(self, up_token):
7479

7580
return ak, bucket
7681

77-
def get_bucket_hosts(self, ak, bucket):
82+
def get_bucket_hosts(self, ak, bucket, home_dir):
7883
key = self.scheme + ":" + ak + ":" + bucket
7984

80-
bucket_hosts = self.get_bucket_hosts_to_cache(key)
85+
bucket_hosts = self.get_bucket_hosts_to_cache(key, home_dir)
8186
if (len(bucket_hosts) > 0):
8287
return bucket_hosts
8388

@@ -113,14 +118,14 @@ def get_bucket_hosts(self, ak, bucket):
113118
'ioHosts': scheme_hosts['io'],
114119
'deadline': int(time.time()) + hosts['ttl']
115120
}
116-
117-
self.set_bucket_hosts_to_cache(key, bucket_hosts)
121+
home_dir = ""
122+
self.set_bucket_hosts_to_cache(key, bucket_hosts, home_dir)
118123
return bucket_hosts
119124

120-
def get_bucket_hosts_to_cache(self, key):
125+
def get_bucket_hosts_to_cache(self, key, home_dir):
121126
ret = []
122127
if (len(self.host_cache) == 0):
123-
self.host_cache_from_file()
128+
self.host_cache_from_file(home_dir)
124129

125130
if (not (key in self.host_cache)):
126131
return ret
@@ -130,12 +135,14 @@ def get_bucket_hosts_to_cache(self, key):
130135

131136
return ret
132137

133-
def set_bucket_hosts_to_cache(self, key, val):
138+
def set_bucket_hosts_to_cache(self, key, val, home_dir):
134139
self.host_cache[key] = val
135-
self.host_cache_to_file()
140+
self.host_cache_to_file(home_dir)
136141
return
137142

138-
def host_cache_from_file(self):
143+
def host_cache_from_file(self, home_dir):
144+
if home_dir is not None:
145+
self.home_dir = home_dir
139146
path = self.host_cache_file_path()
140147
if not os.path.isfile(path):
141148
return None
@@ -148,7 +155,7 @@ def host_cache_from_file(self):
148155
def host_cache_file_path(self):
149156
return os.path.join(self.home_dir, ".qiniu_pythonsdk_hostscache.json")
150157

151-
def host_cache_to_file(self):
158+
def host_cache_to_file(self, home_dir):
152159
path = self.host_cache_file_path()
153160
with open(path, 'w') as f:
154161
compat.json.dump(self.host_cache, f)

qiniu/services/storage/bucket.py

+14-10
Original file line numberDiff line numberDiff line change
@@ -161,25 +161,28 @@ def copy(self, bucket, key, bucket_to, key_to, force='false'):
161161
to = entry(bucket_to, key_to)
162162
return self.__rs_do('copy', resource, to, 'force/{0}'.format(force))
163163

164-
def fetch(self, url, bucket, key=None):
164+
def fetch(self, url, bucket, key=None, hostscache_dir=None):
165165
"""抓取文件:
166166
从指定URL抓取资源,并将该资源存储到指定空间中,具体规格参考:
167167
http://developer.qiniu.com/docs/v6/api/reference/rs/fetch.html
168168
169169
Args:
170-
url: 指定的URL
171-
bucket: 目标资源空间
172-
key: 目标资源文件名
170+
url: 指定的URL
171+
bucket: 目标资源空间
172+
key: 目标资源文件名
173+
hostscache_dir: host请求 缓存文件保存位置
173174
174175
Returns:
175-
一个dict变量,成功返回NULL,失败返回{"error": "<errMsg string>"}
176+
一个dict变量:
177+
成功 返回{'fsize': <fsize int>, 'hash': <hash string>, 'key': <key string>, 'mimeType': <mimeType string>}
178+
失败 返回 None
176179
一个ResponseInfo对象
177180
"""
178181
resource = urlsafe_base64_encode(url)
179182
to = entry(bucket, key)
180-
return self.__io_do(bucket, 'fetch', resource, 'to/{0}'.format(to))
183+
return self.__io_do(bucket, 'fetch', hostscache_dir, resource, 'to/{0}'.format(to))
181184

182-
def prefetch(self, bucket, key):
185+
def prefetch(self, bucket, key, hostscache_dir=None):
183186
"""镜像回源预取文件:
184187
185188
从镜像源站抓取资源到空间中,如果空间中已经存在,则覆盖该资源,具体规格参考
@@ -188,13 +191,14 @@ def prefetch(self, bucket, key):
188191
Args:
189192
bucket: 待获取资源所在的空间
190193
key: 代获取资源文件名
194+
hostscache_dir: host请求 缓存文件保存位置
191195
192196
Returns:
193197
一个dict变量,成功返回NULL,失败返回{"error": "<errMsg string>"}
194198
一个ResponseInfo对象
195199
"""
196200
resource = entry(bucket, key)
197-
return self.__io_do(bucket, 'prefetch', resource)
201+
return self.__io_do(bucket, 'prefetch', hostscache_dir, resource)
198202

199203
def change_mime(self, bucket, key, mime):
200204
"""修改文件mimeType:
@@ -349,9 +353,9 @@ def __uc_do(self, operation, *args):
349353
def __rs_do(self, operation, *args):
350354
return self.__server_do(config.get_default('default_rs_host'), operation, *args)
351355

352-
def __io_do(self, bucket, operation, *args):
356+
def __io_do(self, bucket, operation, home_dir, *args):
353357
ak = self.auth.get_access_key()
354-
io_host = self.zone.get_io_host(ak, bucket)
358+
io_host = self.zone.get_io_host(ak, bucket, home_dir)
355359
return self.__server_do(io_host, operation, *args)
356360

357361
def __server_do(self, host, operation, *args):

qiniu/services/storage/uploader.py

+39-33
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
def put_data(
1313
up_token, key, data, params=None, mime_type='application/octet-stream', check_crc=False, progress_handler=None,
14-
fname=None):
14+
fname=None, hostscache_dir=None):
1515
"""上传二进制流到七牛
1616
1717
Args:
@@ -22,6 +22,7 @@ def put_data(
2222
mime_type: 上传数据的mimeType
2323
check_crc: 是否校验crc32
2424
progress_handler: 上传进度
25+
hostscache_dir: host请求 缓存文件保存位置
2526
2627
Returns:
2728
一个dict变量,类似 {"hash": "<Hash string>", "key": "<Key string>"}
@@ -39,23 +40,24 @@ def put_data(
3940
final_data = data
4041

4142
crc = crc32(final_data)
42-
return _form_put(up_token, key, final_data, params, mime_type, crc, progress_handler, fname)
43+
return _form_put(up_token, key, final_data, params, mime_type, crc, hostscache_dir, progress_handler, fname)
4344

4445

4546
def put_file(up_token, key, file_path, params=None,
4647
mime_type='application/octet-stream', check_crc=False,
47-
progress_handler=None, upload_progress_recorder=None, keep_last_modified=False):
48+
progress_handler=None, upload_progress_recorder=None, keep_last_modified=False, hostscache_dir=None):
4849
"""上传文件到七牛
4950
5051
Args:
51-
up_token: 上传凭证
52-
key: 上传文件名
53-
file_path: 上传文件的路径
54-
params: 自定义变量,规格参考 http://developer.qiniu.com/docs/v6/api/overview/up/response/vars.html#xvar
55-
mime_type: 上传数据的mimeType
56-
check_crc: 是否校验crc32
57-
progress_handler: 上传进度
52+
up_token: 上传凭证
53+
key: 上传文件名
54+
file_path: 上传文件的路径
55+
params: 自定义变量,规格参考 http://developer.qiniu.com/docs/v6/api/overview/up/response/vars.html#xvar
56+
mime_type: 上传数据的mimeType
57+
check_crc: 是否校验crc32
58+
progress_handler: 上传进度
5859
upload_progress_recorder: 记录上传进度,用于断点续传
60+
hostscache_dir: host请求 缓存文件保存位置
5961
6062
Returns:
6163
一个dict变量,类似 {"hash": "<Hash string>", "key": "<Key string>"}
@@ -68,19 +70,20 @@ def put_file(up_token, key, file_path, params=None,
6870
file_name = os.path.basename(file_path)
6971
modify_time = int(os.path.getmtime(file_path))
7072
if size > config._BLOCK_SIZE * 2:
71-
ret, info = put_stream(up_token, key, input_stream, file_name, size, params,
73+
ret, info = put_stream(up_token, key, input_stream, file_name, size, hostscache_dir, params,
7274
mime_type, progress_handler,
7375
upload_progress_recorder=upload_progress_recorder,
7476
modify_time=modify_time, keep_last_modified=keep_last_modified)
7577
else:
7678
crc = file_crc32(file_path)
7779
ret, info = _form_put(up_token, key, input_stream, params, mime_type,
78-
crc, progress_handler, file_name,
80+
crc, hostscache_dir, progress_handler, file_name,
7981
modify_time=modify_time, keep_last_modified=keep_last_modified)
8082
return ret, info
8183

8284

83-
def _form_put(up_token, key, data, params, mime_type, crc, progress_handler=None, file_name=None, modify_time=None,
85+
def _form_put(up_token, key, data, params, mime_type, crc, hostscache_dir=None, progress_handler=None, file_name=None,
86+
modify_time=None,
8487
keep_last_modified=False):
8588
fields = {}
8689
if params:
@@ -95,7 +98,7 @@ def _form_put(up_token, key, data, params, mime_type, crc, progress_handler=None
9598
if config.get_default('default_zone').up_host:
9699
url = config.get_default('default_zone').up_host
97100
else:
98-
url = config.get_default('default_zone').get_up_host_by_token(up_token)
101+
url = config.get_default('default_zone').get_up_host_by_token(up_token, hostscache_dir)
99102
# name = key if key else file_name
100103

101104
fname = file_name
@@ -112,7 +115,7 @@ def _form_put(up_token, key, data, params, mime_type, crc, progress_handler=None
112115
if config.get_default('default_zone').up_host_backup:
113116
url = config.get_default('default_zone').up_host_backup
114117
else:
115-
url = config.get_default('default_zone').get_up_host_backup_by_token(up_token)
118+
url = config.get_default('default_zone').get_up_host_backup_by_token(up_token, hostscache_dir)
116119
if hasattr(data, 'read') is False:
117120
pass
118121
elif hasattr(data, 'seek') and (not hasattr(data, 'seekable') or data.seekable()):
@@ -124,11 +127,11 @@ def _form_put(up_token, key, data, params, mime_type, crc, progress_handler=None
124127
return r, info
125128

126129

127-
def put_stream(up_token, key, input_stream, file_name, data_size, params=None,
130+
def put_stream(up_token, key, input_stream, file_name, data_size, hostscache_dir=None, params=None,
128131
mime_type=None, progress_handler=None,
129132
upload_progress_recorder=None, modify_time=None, keep_last_modified=False):
130-
task = _Resume(up_token, key, input_stream, data_size, params, mime_type,
131-
progress_handler, upload_progress_recorder, modify_time, file_name, keep_last_modified)
133+
task = _Resume(up_token, key, input_stream, file_name, data_size, hostscache_dir, params, mime_type,
134+
progress_handler, upload_progress_recorder, modify_time, keep_last_modified)
132135
return task.upload()
133136

134137

@@ -140,30 +143,32 @@ class _Resume(object):
140143
http://developer.qiniu.com/docs/v6/api/reference/up/mkfile.html
141144
142145
Attributes:
143-
up_token: 上传凭证
144-
key: 上传文件名
145-
input_stream: 上传二进制流
146-
data_size: 上传流大小
147-
params: 自定义变量,规格参考 http://developer.qiniu.com/docs/v6/api/overview/up/response/vars.html#xvar
148-
mime_type: 上传数据的mimeType
149-
progress_handler: 上传进度
150-
upload_progress_recorder: 记录上传进度,用于断点续传
151-
modify_time: 上传文件修改日期
146+
up_token: 上传凭证
147+
key: 上传文件名
148+
input_stream: 上传二进制流
149+
data_size: 上传流大小
150+
params: 自定义变量,规格参考 http://developer.qiniu.com/docs/v6/api/overview/up/response/vars.html#xvar
151+
mime_type: 上传数据的mimeType
152+
progress_handler: 上传进度
153+
upload_progress_recorder: 记录上传进度,用于断点续传
154+
modify_time: 上传文件修改日期
155+
hostscache_dir: host请求 缓存文件保存位置
152156
"""
153157

154-
def __init__(self, up_token, key, input_stream, data_size, params, mime_type,
155-
progress_handler, upload_progress_recorder, modify_time, file_name, keep_last_modified):
158+
def __init__(self, up_token, key, input_stream, file_name, data_size, hostscache_dir, params, mime_type,
159+
progress_handler, upload_progress_recorder, modify_time, keep_last_modified):
156160
"""初始化断点续上传"""
157161
self.up_token = up_token
158162
self.key = key
159163
self.input_stream = input_stream
164+
self.file_name = file_name
160165
self.size = data_size
166+
self.hostscache_dir = hostscache_dir
161167
self.params = params
162168
self.mime_type = mime_type
163169
self.progress_handler = progress_handler
164170
self.upload_progress_recorder = upload_progress_recorder or UploadProgressRecorder()
165171
self.modify_time = modify_time or time.time()
166-
self.file_name = file_name
167172
self.keep_last_modified = keep_last_modified
168173
# print(self.modify_time)
169174
# print(modify_time)
@@ -186,7 +191,7 @@ def recovery_from_record(self):
186191

187192
try:
188193
if not record['modify_time'] or record['size'] != self.size or \
189-
record['modify_time'] != self.modify_time:
194+
record['modify_time'] != self.modify_time:
190195
return 0
191196
except KeyError:
192197
return 0
@@ -199,7 +204,7 @@ def upload(self):
199204
if config.get_default('default_zone').up_host:
200205
host = config.get_default('default_zone').up_host
201206
else:
202-
host = config.get_default('default_zone').get_up_host_by_token(self.up_token)
207+
host = config.get_default('default_zone').get_up_host_by_token(self.up_token, self.hostscache_dir)
203208
offset = self.recovery_from_record()
204209
for block in _file_iter(self.input_stream, config._BLOCK_SIZE, offset):
205210
length = len(block)
@@ -211,7 +216,8 @@ def upload(self):
211216
if config.get_default('default_zone').up_host_backup:
212217
host = config.get_default('default_zone').up_host_backup
213218
else:
214-
host = config.get_default('default_zone').get_up_host_backup_by_token(self.up_token)
219+
host = config.get_default('default_zone').get_up_host_backup_by_token(self.up_token,
220+
self.hostscache_dir)
215221
if info.need_retry() or crc != ret['crc32']:
216222
ret, info = self.make_block(block, length, host)
217223
if ret is None or crc != ret['crc32']:

0 commit comments

Comments
 (0)