У меня есть конвейер, который создает 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)