2015-09-14 75 views
0

後我有一瓶「服務器」服務我。RAW格式塊設備的圖像。不幸的是,下載完成後(成功與否,無關緊要)我必須運行另一種方法來卸載導出的塊設備。瓶運行的命令文件下載

下面我提供用於導出圖像的代碼,但只爲我提供了錯誤的(不能去映射器,因爲它是使用不同的工藝),並如預期未導出圖像:

class ExportResponse(HTTPResponse): 
    def __init__(self, devpath, volume_name): 
     self.devpath = devpath 
     self.volume_name = volume_name 

     output_filename = "%s.raw" % (volume_name) 

     fp = open(devpath) 
     content_length = os.lseek(fp.fileno(), 0, os.SEEK_END) 
     os.lseek(fp.fileno(), 0, os.SEEK_SET) 
     headers = { 
       'Content-Length': str(content_length), 
       'Content-Type': "application/octet-stream", 
       'Content-Disposition': 'attachment; filename="%s"' % output_filename 
       } 
     log.info("%s, %s" % (os.SEEK_CUR, content_length)) 
     super(ExportResponse, self).__init__(fp, **headers) 

@get('/retrieve/<volume_name>/') 
def export_volume(volume_name): 
    fmt = request.query['format'] 
    dev = find_mapping(volume_name) 
    if dev: 
     log.debug("export, name=%s, already mapped dev=%s" % (repr(volume_name), str(dev))) 
    dev_owner = dev is None 
    try: 
     if not dev: 
      map_volume(volume_name) 
      dev = find_mapping(volume_name) 
      log.debug("export, name=%s, mapped to dev=%s" % (repr(volume_name), str(dev))) 
     return(ExportResponse(dev, volume_name)) 
    except: 
     log.exception("export, name=%s" % repr(volume_name)) 
     if dev and dev_owner: 
      unmap_volume(volume_name) 
     raise 
    finally: 
     unmap_volume(volume_name) 

是有沒有這樣做的好方法?

+0

'不能取消映射設備,因爲它被不同的進程使用 - 爲什麼你希望'unmap'在其他進程正在使用時工作它? –

+0

這就是爲什麼我要求幫助,因爲我不知道如何完成導出,然後取消映射設備。 –

+0

但你說它正在被一個不同的process_使用。所以這個問題與你自己的出口沒有任何關係,對吧?其他一些進程一起使用磁盤。 –

回答

0

這樣做有兩種方式。

1)使用BytesIO對象讀取整個圖像到內存中。使用它作爲流傳遞給__init__而不是實際文件的句柄。

2)從瓶中獲取原始句柄響應流和使用上的流write()方法,當你完成寫入文件自己的塊,將其關閉。我不確定如何從瓶子中獲得該流,但我知道它存在,因爲WSGI protocol specifies the response is passed as a stream.