在blob服务python

时间:2015-08-14 14:04:34

标签: python azure azure-storage-blobs

使用python azure模块中的附加块的Azure blob存储服务不起作用。当我试图修改模块时,它显示以下错误。

Traceback (most recent call last):
  File "C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\Extensions\Microsoft\Python Tools for Visual Studio\2.1\visualstudio_py_util.py", line 106, in exec_file
    exec_code(code, file, global_variables)
  File "C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\Extensions\Microsoft\Python Tools for Visual Studio\2.1\visualstudio_py_util.py", line 82, in exec_code
    exec(code_obj, global_variables)
  File "E:\Finons\Sankar\Source\Source\WebsiteTracking\testing.py", line 15, in<module>
  blob_service.append_block_blob_from_file(containername,filename,filepath,None)
  File "C:\Python27\lib\site-packages\azure\storage\blobservice.py", line 2723, in append_block_blob_from_file
  x_ms_lease_id,
  File "C:\Python27\lib\site-packages\azure\storage\blobservice.py", line 851, in put_blob    self._perform_request(request)
  File "C:\Python27\lib\site-packages\azure\storage\storageclient.py", line 179,  in _perform_request
    _storage_error_handler(ex)
  File "C:\Python27\lib\site-packages\azure\storage\__init__.py", line 1186, in _storage_error_handler
    return _general_error_handler(http_error)
  File "C:\Python27\lib\site-packages\azure\__init__.py", line 551, in _general_error_handler
    http_error.respbody.decode('utf-8-sig'))
WindowsAzureError: Unknown error (Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.)
<?xml version="1.0" encoding="utf-8"?><Error><Code>AuthenticationFailed</Code><Message>Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.
RequestId:898a6c60-0001-0094-2b99-d6da0d000000 Time:2015-08-14T13:58:54.9779810Z</Message><AuthenticationErrorDetail>The MAC signature found in the HTTP request 'DAAfD/aLQHqljUS35p7CoX+JBc5lyrPr1twQIQEW0HI='
 is not the same as any computed signature. Server used following string to sign: 'PUT

application/octet-stream Charset=UTF-8

是否有可能解决此错误?

这是我在SDK中给出的模块中的代码更改。

def append_block_blob_from_file(self, container_name, blob_name, stream,
                             count=None, content_encoding=None,
                             content_language=None, content_md5=None,
                             cache_control=None,
                             x_ms_blob_content_type=None,
                             x_ms_blob_content_encoding=None,
                             x_ms_blob_content_language=None,
                             x_ms_blob_content_md5=None,
                             x_ms_blob_cache_control=None,
                             x_ms_meta_name_values=None,
                             x_ms_lease_id=None, progress_callback=None,
                             max_connections=1, max_retries=5, retry_wait=1.0):

    _validate_not_none('container_name', container_name)
    _validate_not_none('blob_name', blob_name)
    _validate_not_none('stream', stream)

    if count and count < self._BLOB_MAX_DATA_SIZE:
        if progress_callback:
            progress_callback(0, count)

        data = stream.read(count)
        self.put_blob(container_name,
                      blob_name,
                      data,
                      'AppendBlob',
                      content_encoding,
                      content_language,
                      content_md5,
                      cache_control,
                      x_ms_blob_content_type,
                      x_ms_blob_content_encoding,
                      x_ms_blob_content_language,
                      x_ms_blob_content_md5,
                      x_ms_blob_cache_control,
                      x_ms_meta_name_values,
                      x_ms_lease_id)

        if progress_callback:
            progress_callback(count, count)
    else:
        self.put_blob(
            container_name,
            blob_name,
            None,
            'AppendBlob',
            content_encoding,
            content_language,
            content_md5,
            cache_control,
            x_ms_blob_content_type,
            x_ms_blob_content_encoding,
            x_ms_blob_content_language,
            x_ms_blob_content_md5,
            x_ms_blob_cache_control,
            x_ms_meta_name_values,
            x_ms_lease_id,
        )

        _upload_blob_chunks(
            self,
            container_name,
            blob_name,
            count,
            self._BLOB_MAX_CHUNK_DATA_SIZE,
            stream,
            max_connections,
            max_retries,
            retry_wait,
            progress_callback,
            x_ms_lease_id,
            _AppendBlobChunkUploader,
        )

        self.put_block_list(
            container_name,
            blob_name,
            block_ids,
            content_md5,
            x_ms_blob_cache_control,
            x_ms_blob_content_type,
            x_ms_blob_content_encoding,
            x_ms_blob_content_language,
            x_ms_blob_content_md5,
            x_ms_meta_name_values,
            x_ms_lease_id,
        )

我在 Init .py

中定义了以下代码
class _AppendBlobChunkUploader(_BlobChunkUploader):
def _append_chunk(self, chunk_offset, chunk_data):
    range_id = url_quote(_encode_base64('{0:032d}'.format(chunk_offset)))
    self.blob_service.put_block(
        self.container_name,
        self.blob_name,
        chunk_data,
        range_id,
        x_ms_lease_id=self.x_ms_lease_id,x_ms_blob_condition_maxsize=4194304,x_ms_blob_condition_appendpos=chunk_offset
    )
    return range_id

请注意最后两个附加参数。我在参考api参考后将其包括在内。还将版本修改为 X_MS_VERSION =&#39; 2015-02-21&#39;

参考链接:https://msdn.microsoft.com/en-us/library/azure/mt427365.aspx

2 个答案:

答案 0 :(得分:2)

您似乎没有提供说明中的constexpr const S *sp = &s; 功能详细信息。我检查了Python SDK,我没有发现put_block函数支持put_block类中的x_ms_blob_condition_maxsizex_ms_blob_condition_appendpos这两个参数。但是,对于您的方案,我建议您可以使用Azure Blob REST API附加您的块,正如Gaurav所说。 同时,从您的错误消息中,我确信您的签名有问题。 我使用一个简单的代码来构造签名字符串,请参考它:

BlobService

你应该得到你的blockblob长度并使用这个请求向服务器发送blockblob数据。

答案 1 :(得分:0)

以防万一其他人遇到相同的问题,这是一个link,并带有示例如何从python追加的示例

from azure.storage.blob import AppendBlobService

append_blob_service = AppendBlobService(account_name='myaccount', account_key='mykey')

# The same containers can hold all types of blobs
append_blob_service.create_container('mycontainer')

# Append blobs must be created before they are appended to
append_blob_service.create_blob('mycontainer', 'myappendblob')
append_blob_service.append_blob_from_text('mycontainer', 'myappendblob', u'Hello, world!')

append_blob = append_blob_service.get_blob_to_text('mycontainer', 'myappendblob')