Skip to content

Commit

Permalink
Merge d59cd7d into 473bd51
Browse files Browse the repository at this point in the history
  • Loading branch information
hangzws committed Jan 11, 2019
2 parents 473bd51 + d59cd7d commit c10abcc
Show file tree
Hide file tree
Showing 9 changed files with 227 additions and 187 deletions.
2 changes: 2 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ python:
- 3.4
- 3.5
install:
- if [[ $TRAVIS_PYTHON_VERSION == '3.3' ]]; then travis_retry pip install pycryptodome==3.6.6;
fi
- pip install crcmod requests nose nose-cov python-coveralls pycryptodome aliyun-python-sdk-sts
aliyun-python-sdk-kms
- pip install --upgrade mock
Expand Down
11 changes: 11 additions & 0 deletions README-CN.rst
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,17 @@ Python 2.6,2.7,3.3,3.4,3.5
except oss2.exceptions.NoSuchKey as e:
print('{0} not found: http_status={1}, request_id={2}'.format(key, e.status, e.request_id))
设置日志
---------------
使用下面的代码可以设置oss2的日志级别.

.. code-block:: python
import logging
logging.getLogger('oss2').setLevel(logging.WARNING)
测试
----

Expand Down
9 changes: 9 additions & 0 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,15 @@ The Python SDK interface will throw an exception in case of an error (see oss2.e
except oss2.exceptions.NoSuchKey as e:
print('{0} not found: http_status={1}, request_id={2}'.format(key, e.status, e.request_id))
Setup Logging
---------------

The following code can set the logging level of 'oss2'.
.. code-block:: python
import logging
logging.getLogger('oss2').setLevel(logging.WARNING)
Testing
-------

Expand Down
6 changes: 6 additions & 0 deletions examples/object_basic.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,12 @@
# 上传一段字符串。Object名是motto.txt,内容是一段名言。
bucket.put_object('motto.txt', 'Never give up. - Jack Ma')

# 获取Object的metadata
object_meta = bucket.get_object_meta('你的对象名')
print('last modified: ' + object_meta.last_modified)
print('etag: ' + object_meta.etag)
print('size: ' + object_meta.content_length)

# 下载到本地文件
bucket.get_object_to_file('motto.txt', '本地文件名.txt')

Expand Down
3 changes: 0 additions & 3 deletions oss2/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,3 @@ def set_stream_logger(name='oss2', level=logging.DEBUG, format_string=None):
formatter = logging.Formatter(format_string)
fh.setFormatter(formatter)
logger.addHandler(fh)


set_stream_logger('oss2', logging.INFO)
337 changes: 174 additions & 163 deletions oss2/api.py

Large diffs are not rendered by default.

18 changes: 9 additions & 9 deletions oss2/auth.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,10 @@

def make_auth(access_key_id, access_key_secret, auth_version=AUTH_VERSION_1):
if auth_version == AUTH_VERSION_2:
logger.info("Init Auth V2: access_key_id: {0}, access_key_secret: ******".format(access_key_id))
logger.debug("Init Auth V2: access_key_id: {0}, access_key_secret: ******".format(access_key_id))
return AuthV2(access_key_id.strip(), access_key_secret.strip())
else:
logger.info("Init Auth v1: access_key_id: {0}, access_key_secret: ******".format(access_key_id))
logger.debug("Init Auth v1: access_key_id: {0}, access_key_secret: ******".format(access_key_id))
return Auth(access_key_id.strip(), access_key_secret.strip())


Expand All @@ -30,7 +30,7 @@ def __init__(self, access_key_id, access_key_secret):
self.id = access_key_id.strip()
self.secret = access_key_secret.strip()

def _sign_rtmp_url(self, url, bucket_name, channel_name, playlist_name, expires, params):
def _sign_rtmp_url(self, url, bucket_name, channel_name, expires, params):
expiration_time = int(time.time()) + expires

canonicalized_resource = "/%s/%s" % (bucket_name, channel_name)
Expand Down Expand Up @@ -156,7 +156,7 @@ def __param_to_query(self, k, v):
return k + '=' + v
else:
return k


class AnonymousAuth(object):
"""用于匿名访问。
Expand All @@ -171,9 +171,9 @@ def _sign_request(self, req, bucket_name, key):
def _sign_url(self, req, bucket_name, key, expires):
return req.url + '?' + '&'.join(_param_to_quoted_query(k, v) for k, v in req.params.items())

def _sign_rtmp_url(self, url, bucket_name, channel_name, playlist_name, expires, params):
def _sign_rtmp_url(self, url, bucket_name, channel_name, expires, params):
return url + '?' + '&'.join(_param_to_quoted_query(k, v) for k, v in params.items())


class StsAuth(object):
"""用于STS临时凭证访问。可以通过官方STS客户端获得临时密钥(AccessKeyId、AccessKeySecret)以及临时安全令牌(SecurityToken)。
Expand All @@ -187,7 +187,7 @@ class StsAuth(object):
:param str auth_version: 需要生成auth的版本,默认为AUTH_VERSION_1(v1)
"""
def __init__(self, access_key_id, access_key_secret, security_token, auth_version=AUTH_VERSION_1):
logger.info("Init StsAuth: access_key_id: {0}, access_key_secret: ******, security_token: ******".format(access_key_id))
logger.debug("Init StsAuth: access_key_id: {0}, access_key_secret: ******, security_token: ******".format(access_key_id))
self.__auth = make_auth(access_key_id, access_key_secret, auth_version)
self.__security_token = security_token

Expand All @@ -199,9 +199,9 @@ def _sign_url(self, req, bucket_name, key, expires):
req.params['security-token'] = self.__security_token
return self.__auth._sign_url(req, bucket_name, key, expires)

def _sign_rtmp_url(self, url, bucket_name, channel_name, playlist_name, expires, params):
def _sign_rtmp_url(self, url, bucket_name, channel_name, expires, params):
params['security-token'] = self.__security_token
return self.__auth._sign_rtmp_url(url, bucket_name, channel_name, playlist_name, expires, params)
return self.__auth._sign_rtmp_url(url, bucket_name, channel_name, expires, params)


def _param_to_quoted_query(k, v):
Expand Down
24 changes: 12 additions & 12 deletions oss2/resumable.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ def resumable_upload(bucket, key, filename,
:param progress_callback: 上传进度回调函数。参见 :ref:`progress_callback` 。
:param num_threads: 并发上传的线程数,如不指定则使用 `oss2.defaults.multipart_num_threads` 。
"""
logger.info("Start to resumable upload, bucket: {0}, key: {1}, filename: {2}, headers: {3}, "
logger.debug("Start to resumable upload, bucket: {0}, key: {1}, filename: {2}, headers: {3}, "
"multipart_threshold: {4}, part_size: {5}, num_threads: {6}".format(bucket.bucket_name, to_string(key),
filename, headers, multipart_threshold,
part_size, num_threads))
Expand All @@ -80,7 +80,7 @@ def resumable_upload(bucket, key, filename,
else:
with open(to_unicode(filename), 'rb') as f:
result = bucket.put_object(key, f, headers=headers, progress_callback=progress_callback)

return result


Expand Down Expand Up @@ -123,7 +123,7 @@ def resumable_download(bucket, key, filename,
:raises: 如果OSS文件不存在,则抛出 :class:`NotFound <oss2.exceptions.NotFound>` ;也有可能抛出其他因下载文件而产生的异常。
"""

logger.info("Start to resumable download, bucket: {0}, key: {1}, filename: {2}, multiget_threshold: {3}, "
logger.debug("Start to resumable download, bucket: {0}, key: {1}, filename: {2}, multiget_threshold: {3}, "
"part_size: {4}, num_threads: {5}".format(bucket.bucket_name, to_string(key), filename,
multiget_threshold, part_size, num_threads))
multiget_threshold = defaults.get(multiget_threshold, defaults.multiget_threshold)
Expand Down Expand Up @@ -206,7 +206,7 @@ def __init__(self, bucket, key, filename, size, store,

self.__store = store
self.__record_key = self.__store.make_store_key(bucket.bucket_name, self.key, self._abspath)
logger.info("Init _ResumableOperation, record_key: {0}".format(self.__record_key))
logger.debug("Init _ResumableOperation, record_key: {0}".format(self.__record_key))

# protect self.__progress_callback
self.__plock = threading.Lock()
Expand Down Expand Up @@ -265,7 +265,7 @@ def __init__(self, bucket, key, filename, objectInfo,
# protect record
self.__lock = threading.Lock()
self.__record = None
logger.info("Init _ResumableDownloader, bucket: {0}, key: {1}, part_size: {2}, num_thread: {3}".format(
logger.debug("Init _ResumableDownloader, bucket: {0}, key: {1}, part_size: {2}, num_thread: {3}".format(
bucket.bucket_name, to_string(key), self.__part_size, self.__num_threads))

def download(self, server_crc = None):
Expand Down Expand Up @@ -369,19 +369,19 @@ def is_record_sane(record):
try:
for key in ('etag', 'tmp_suffix', 'abspath', 'bucket', 'key'):
if not isinstance(record[key], str):
logger.info('{0} is not a string: {1}'.format(key, record[key]))
logger.error('{0} is not a string: {1}'.format(key, record[key]))
return False

for key in ('part_size', 'size', 'mtime'):
if not isinstance(record[key], int):
logger.info('{0} is not an integer: {1}'.format(key, record[key]))
logger.error('{0} is not an integer: {1}'.format(key, record[key]))
return False

if not isinstance(record['parts'], list):
logger.info('{0} is not a list: {1}'.format(key, record[key]))
logger.error('{0} is not a list: {1}'.format(key, record[key]))
return False
except KeyError as e:
logger.info('Key not found: {0}'.format(e.args))
logger.error('Key not found: {0}'.format(e.args))
return False

return True
Expand Down Expand Up @@ -443,7 +443,7 @@ def __init__(self, bucket, key, filename, size,
self.__record = None
self.__finished_size = 0
self.__finished_parts = None
logger.info("Init _ResumableUploader, bucket: {0}, key: {1}, part_size: {2}, num_thread: {3}".format(
logger.debug("Init _ResumableUploader, bucket: {0}, key: {1}, part_size: {2}, num_thread: {3}".format(
bucket.bucket_name, to_string(key), self.__part_size, self.__num_threads))

def upload(self):
Expand All @@ -461,7 +461,7 @@ def upload(self):

result = self.bucket.complete_multipart_upload(self.key, self.__upload_id, self.__finished_parts)
self._del_record()

return result

def __producer(self, q, parts_to_upload=None):
Expand Down Expand Up @@ -517,7 +517,7 @@ def __load_record(self):

if not record:
part_size = determine_part_size(self.size, self.__part_size)
logger.info("Upload File size: {0}, User-specify part_size: {1}, Calculated part_size: {2}".format(
logger.debug("Upload File size: {0}, User-specify part_size: {1}, Calculated part_size: {2}".format(
self.size, self.__part_size, part_size))
upload_id = self.bucket.init_multipart_upload(self.key, headers=self.__headers).upload_id
record = {'upload_id': upload_id, 'mtime': self.__mtime, 'size': self.size, 'parts': [],
Expand Down
4 changes: 4 additions & 0 deletions tests/test_live_channel.py
Original file line number Diff line number Diff line change
Expand Up @@ -239,6 +239,10 @@ def test_sign_rtmp_url(self):
expires = 3600
signed_url = self.bucket.sign_rtmp_url(channel_name, playlist_name, expires)
self.assertTrue(signed_url.startswith(self._get_publish_url(self.bucket.bucket_name, channel_name)))

# empty playlist name
signed_url = self.bucket.sign_rtmp_url(channel_name, '', expires)
self.assertTrue(signed_url.startswith(self._get_publish_url(self.bucket.bucket_name, channel_name)))

self.bucket.delete_live_channel(channel_name)

Expand Down

0 comments on commit c10abcc

Please sign in to comment.