2013-06-17 2 views
0

У меня есть конвейер, который создает blob в blobstore и помещает полученный blob_key в один из его named outputs. Когда я запускаю конвейер через веб-интерфейс, который я построил вокруг него, все работает чудесно. Теперь я хочу создать небольшой тестовый пример, который выполнит этот конвейер, прочитает blob из blobstore и сохранит его во временное место где-то еще на диске, чтобы я мог его осмотреть. (Так как testbed.init_files_stub() хранит только память в памяти на протяжении всего теста).Как я могу прочитать blob, который был написан в Blobstore Pipeline в рамках тестовой среды?

Конвейер в тестовом примере, кажется, работает нормально и приводит к тому, что выглядит как действительный blob_key, но когда я передаю этот blob_key в класс blobstore.BlobReader, он не может найти blob по какой-то причине. Из трассировки кажется, что BlobReader пытается получить доступ к реальному blobstore, в то время как писатель (внутри конвейера) пишет на , заштрихованный blobstore. У меня есть --blobstore_path setup на dev_appserver.py, и я не вижу никаких капель, записанных на диск в тестовом примере, но когда я запускаю его из веб-интерфейса, там появляются капли.

Вот отслеживающий:

Traceback (most recent call last): 
    File "/Users/mattfaus/dev/webapp/coach_resources/student_use_data_report_test.py", line 138, in test_serial_pipeline 
    self.write_out_blob(stage.outputs.xlsx_blob_key) 
    File "/Users/mattfaus/dev/webapp/coach_resources/student_use_data_report_test.py", line 125, in write_out_blob 
    writer.write(reader.read()) 
    File "/Users/mattfaus/Desktop/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/blobstore/blobstore.py", line 837, in read 
    self.__fill_buffer(size) 
    File "/Users/mattfaus/Desktop/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/blobstore/blobstore.py", line 809, in __fill_buffer 
    self.__position + read_size - 1) 
    File "/Users/mattfaus/Desktop/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/blobstore/blobstore.py", line 657, in fetch_data 
    return rpc.get_result() 
    File "/Users/mattfaus/Desktop/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/apiproxy_stub_map.py", line 604, in get_result 
    return self.__get_result_hook(self) 
    File "/Users/mattfaus/Desktop/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/api/blobstore/blobstore.py", line 232, in _get_result_hook 
    raise _ToBlobstoreError(err) 
BlobNotFoundError 

Вот мой тестовый код:

def write_out_blob(self, blob_key, save_path='/tmp/blob.xlsx'): 
    """Reads a blob from the blobstore and writes it out to the file.""" 
    print str(blob_key) 
    # blob_info = blobstore.BlobInfo.get(str(blob_key)) # Returns None 
    # reader = blob_info.open() # Returns None 
    reader = blobstore.BlobReader(str(blob_key)) 
    writer = open(save_path, 'w') 
    writer.write(reader.read()) 
    print blob_key, 'written to', save_path 

def test_serial_pipeline(self): 
    stage = student_use_data_report.StudentUseDataReportSerialPipeline(
     self.query_config) 

    stage.start_test() 
    self.assertIsNotNone(stage.outputs.xlsx_blob_key)  
    self.write_out_blob(stage.outputs.xlsx_blob_key) 

ответ

0

Оказывается, что я просто отсутствует .value свойство, здесь:

self.assertIsNotNone(stage.outputs.xlsx_blob_key)  
self.write_out_blob(stage.outputs.xlsx_blob_key.value) # Don't forget .value!! 

[ДОПОЛНЕНО] SDK панель инструментов также предоставляет список всех блобов в вашем блобе, удобно отсортированных по дате создания. Он доступен по адресу http://127.0.0.1:8000/blobstore.

0

Может быть полезно, если вы покажете, как вы завершили сборку файла blobstore, или если вы можете попробовать этот код завершения отдельно. Похоже, что API файлов не завершил корректный файл на сервере приложений.

Смежные вопросы