Skip to content

Commit c1ddb54

Browse files
committed
Merge pull request #168 from longbai/master
multi zone
2 parents 052d33f + 5f4e460 commit c1ddb54

File tree

6 files changed

+58
-38
lines changed

6 files changed

+58
-38
lines changed

CHANGELOG.md

+9-3
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,18 @@
11
#Changelog
22

3-
## 7.0.4 (2014-05-04)
3+
## 7.0.5 (2015-06-25)
4+
### 变更
5+
* 配置up_host 改为配置zone
6+
7+
### 增加
8+
* fectch 支持不指定key
9+
10+
## 7.0.4 (2015-05-04)
411
### 修正
512
* 上传重试为空文件
613
* 回调应该只对form data 签名。
714

8-
9-
## 7.0.3 (2014-03-11)
15+
## 7.0.3 (2015-03-11)
1016
### 增加
1117
* 可以配置 io/rs/api/rsf host
1218

qiniu/__init__.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@
99

1010
# flake8: noqa
1111

12-
__version__ = '7.0.4'
12+
__version__ = '7.0.5'
1313

1414
from .auth import Auth
1515

16-
from .config import set_default
16+
from .config import set_default, Zone
1717

1818
from .services.storage.bucket import BucketManager, build_batch_copy, build_batch_rename, build_batch_move, build_batch_stat, build_batch_delete
1919
from .services.storage.uploader import put_data, put_file, put_stream

qiniu/auth.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,8 @@ class Auth(object):
5353
def __init__(self, access_key, secret_key):
5454
"""初始化Auth类"""
5555
self.__checkKey(access_key, secret_key)
56-
self.__access_key, self.__secret_key = access_key, secret_key
57-
self.__secret_key = b(self.__secret_key)
56+
self.__access_key = access_key
57+
self.__secret_key = b(secret_key)
5858

5959
def __token(self, data):
6060
data = b(data)

qiniu/config.py

+25-11
Original file line numberDiff line numberDiff line change
@@ -5,36 +5,50 @@
55
RSF_HOST = 'rsf.qbox.me' # 列举操作Host
66
API_HOST = 'api.qiniu.com' # 数据处理操作Host
77

8-
UPAUTO_HOST = 'up.qiniu.com' # 默认上传Host
9-
UPDX_HOST = 'updx.qiniu.com' # 电信上传Host
10-
UPLT_HOST = 'uplt.qiniu.com' # 联通上传Host
11-
UPYD_HOST = 'upyd.qiniu.com' # 移动上传Host
12-
UPBACKUP_HOST = 'upload.qiniu.com' # 备用上传Host
8+
_BLOCK_SIZE = 1024 * 1024 * 4 # 断点续上传分块大小,该参数为接口规格,暂不支持修改
9+
10+
11+
class Zone(object):
12+
"""七牛上传区域类
13+
14+
该类主要内容上传区域地址。
15+
16+
Attributes:
17+
up_host: 首选上传地址
18+
up_host_backup: 备用上传地址
19+
"""
20+
def __init__(self, up_host, up_host_backup):
21+
"""初始化Zone类"""
22+
self.up_host, self.up_host_backup = up_host, up_host_backup
23+
24+
25+
zone0 = Zone('up.qiniu.com', 'upload.qiniu.com')
26+
zone1 = Zone('up-z1.qiniu.com', 'upload-z1.qiniu.com')
1327

1428
_config = {
15-
'default_up_host': UPAUTO_HOST, # 设置为默认上传Host
29+
'default_up_host': zone0.up_host, # 设置为默认上传Host
30+
'default_up_host_backup': zone0.up_host_backup,
1631
'default_rs_host': RS_HOST,
1732
'default_io_host': IO_HOST,
1833
'default_rsf_host': RSF_HOST,
1934
'default_api_host': API_HOST,
2035
'connection_timeout': 30, # 链接超时为时间为30s
2136
'connection_retries': 3, # 链接重试次数为3次
2237
'connection_pool': 10, # 链接池个数为10
23-
2438
}
25-
_BLOCK_SIZE = 1024 * 1024 * 4 # 断点续上传分块大小,该参数为接口规格,暂不支持修改
2639

2740

2841
def get_default(key):
2942
return _config[key]
3043

3144

3245
def set_default(
33-
default_up_host=None, connection_retries=None, connection_pool=None,
46+
default_zone=None, connection_retries=None, connection_pool=None,
3447
connection_timeout=None, default_rs_host=None, default_io_host=None,
3548
default_rsf_host=None, default_api_host=None):
36-
if default_up_host:
37-
_config['default_up_host'] = default_up_host
49+
if default_zone:
50+
_config['default_up_host'] = default_zone.up_host
51+
_config['default_up_host_backup'] = default_zone.up_host_backup
3852
if default_rs_host:
3953
_config['default_rs_host'] = default_rs_host
4054
if default_io_host:

qiniu/services/storage/uploader.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ def _form_put(up_token, key, data, params, mime_type, crc, progress_handler=None
7171
r, info = http._post_file(url, data=fields, files={'file': (name, data, mime_type)})
7272
if r is None and info.need_retry():
7373
if info.connect_failed:
74-
url = 'http://' + config.UPBACKUP_HOST + '/'
74+
url = 'http://' + config.get_default('default_up_host_backup') + '/'
7575
if hasattr(data, 'read') is False:
7676
pass
7777
elif hasattr(data, 'seek') and (not hasattr(data, 'seekable') or data.seekable()):
@@ -126,7 +126,7 @@ def upload(self):
126126
if ret is None and not info.need_retry:
127127
return ret, info
128128
if info.connect_failed:
129-
host = config.UPBACKUP_HOST
129+
host = config.get_default('default_up_host_backup')
130130
if info.need_retry or crc != ret['crc32']:
131131
ret, info = self.make_block(block, length, host)
132132
if ret is None or crc != ret['crc32']:

test_qiniu.py

+18-18
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import unittest
1010
import pytest
1111

12-
from qiniu import Auth, set_default, etag, PersistentFop, build_op, op_save
12+
from qiniu import Auth, set_default, etag, PersistentFop, build_op, op_save, Zone
1313
from qiniu import put_data, put_file, put_stream
1414
from qiniu import BucketManager, build_batch_copy, build_batch_rename, build_batch_move, build_batch_stat, build_batch_delete
1515
from qiniu import urlsafe_base64_encode, urlsafe_base64_decode
@@ -132,13 +132,13 @@ def test_fetch(self):
132132
ret, info = self.bucket.fetch('http://developer.qiniu.com/docs/v6/sdk/python-sdk.html', bucket_name, 'fetch.html')
133133
print(info)
134134
assert ret['key'] == 'fetch.html'
135-
assert ret['hash'] == 'FhwVT7vs6xqs1nu_vEdo_4x4qBMB'
135+
assert 'hash' in ret
136136

137137
def test_fetch_without_key(self):
138138
ret, info = self.bucket.fetch('http://developer.qiniu.com/docs/v6/sdk/python-sdk.html', bucket_name)
139139
print(info)
140-
assert ret['key'] == 'FhwVT7vs6xqs1nu_vEdo_4x4qBMB'
141-
assert ret['hash'] == 'FhwVT7vs6xqs1nu_vEdo_4x4qBMB'
140+
assert ret['key'] == ret['hash']
141+
assert 'hash' in ret
142142

143143
def test_stat(self):
144144
ret, info = self.bucket.stat(bucket_name, 'python-sdk.html')
@@ -277,44 +277,44 @@ def test_putWithoutKey(self):
277277
def test_withoutRead_withoutSeek_retry(self):
278278
key = 'retry'
279279
data = 'hello retry!'
280-
set_default(default_up_host='a')
280+
set_default(default_zone=Zone('a', 'upload.qiniu.com'))
281281
token = self.q.upload_token(bucket_name)
282282
ret, info = put_data(token, key, data)
283283
print(info)
284284
assert ret['key'] == key
285285
assert ret['hash'] == 'FlYu0iBR1WpvYi4whKXiBuQpyLLk'
286-
qiniu.set_default(default_up_host=qiniu.config.UPAUTO_HOST)
286+
qiniu.set_default(default_zone=qiniu.config.zone0)
287287

288288
def test_hasRead_hasSeek_retry(self):
289289
key = 'withReadAndSeek_retry'
290290
data = StringIO('hello retry again!')
291-
set_default(default_up_host='a')
291+
set_default(default_zone=Zone('a', 'upload.qiniu.com'))
292292
token = self.q.upload_token(bucket_name)
293293
ret, info = put_data(token, key, data)
294294
print(info)
295295
assert ret['key'] == key
296296
assert ret['hash'] == 'FuEbdt6JP2BqwQJi7PezYhmuVYOo'
297-
qiniu.set_default(default_up_host=qiniu.config.UPAUTO_HOST)
297+
qiniu.set_default(default_zone=qiniu.config.zone0)
298298

299299
def test_hasRead_withoutSeek_retry(self):
300300
key = 'withReadAndWithoutSeek_retry'
301301
data = ReadWithoutSeek('I only have read attribute!')
302-
set_default(default_up_host='a')
302+
set_default(default_zone=Zone('a', 'upload.qiniu.com'))
303303
token = self.q.upload_token(bucket_name)
304304
ret, info = put_data(token, key, data)
305305
print(info)
306-
assert ret == None
307-
qiniu.set_default(default_up_host=qiniu.config.UPAUTO_HOST)
306+
assert ret is None
307+
qiniu.set_default(default_zone=qiniu.config.zone0)
308308

309309
def test_hasRead_WithoutSeek_retry2(self):
310310
key = 'withReadAndWithoutSeek_retry2'
311311
data = urlopen("http://www.qiniu.com")
312-
set_default(default_up_host='a')
312+
set_default(default_zone=Zone('a', 'upload.qiniu.com'))
313313
token = self.q.upload_token(bucket_name)
314314
ret, info = put_data(token, key, data)
315315
print(info)
316-
assert ret == None
317-
qiniu.set_default(default_up_host=qiniu.config.UPAUTO_HOST)
316+
assert ret is None
317+
qiniu.set_default(default_zone=qiniu.config.zone0)
318318

319319

320320
class ResumableUploaderTestCase(unittest.TestCase):
@@ -338,23 +338,23 @@ def test_big_file(self):
338338
token = self.q.upload_token(bucket_name, key)
339339
localfile = create_temp_file(4 * 1024 * 1024 + 1)
340340
progress_handler = lambda progress, total: progress
341-
qiniu.set_default(default_up_host='a')
341+
qiniu.set_default(default_zone=Zone('a', 'upload.qiniu.com'))
342342
ret, info = put_file(token, key, localfile, self.params, self.mime_type, progress_handler=progress_handler)
343343
print(info)
344344
assert ret['key'] == key
345-
qiniu.set_default(default_up_host=qiniu.config.UPAUTO_HOST)
345+
qiniu.set_default(default_zone=qiniu.config.zone0)
346346
remove_temp_file(localfile)
347347

348348
def test_retry(self):
349349
localfile = __file__
350350
key = 'test_file_r_retry'
351-
qiniu.set_default(default_up_host='a')
351+
qiniu.set_default(default_zone=Zone('a', 'upload.qiniu.com'))
352352
token = self.q.upload_token(bucket_name, key)
353353
ret, info = put_file(token, key, localfile, self.params, self.mime_type)
354354
print(info)
355355
assert ret['key'] == key
356356
assert ret['hash'] == etag(localfile)
357-
qiniu.set_default(default_up_host=qiniu.config.UPAUTO_HOST)
357+
qiniu.set_default(default_zone=qiniu.config.zone0)
358358

359359

360360
class DownloadTestCase(unittest.TestCase):

0 commit comments

Comments
 (0)