3

사용되지 않는 파일 api에서 코드를 변환하려고합니다.blobstore.create_gs_key를 사용하여 생성 된 BlobKey의 BlobInfo 객체

다음 코드는 SDK 서버에서 제대로 작동하지만 제작에 실패합니다. 내가 뭘하고 있니? 그렇다면 무엇이 잘못 되었습니까, 어떤 아이디어로 문제를 해결할 수 있습니까?

# Code earlier writes the file bs_file_name. This works fine because I can see the file 
# in the Cloud Console. 
bk = blobstore.create_gs_key("/gs" + bs_file_name) 
assert(bk) 
if not isinstance(bk,blobstore.BlobKey): 
    bk = blobstore.BlobKey(bk) 
assert isinstance(bk,blobstore.BlobKey) 
# next line fails here in production only 
assert(blobstore.get(bk)) # <----------- blobstore.get(bk) returns None 
+0

당신은 점점 어떤 오류? – jterrace

+0

오류가 발생하지 않습니다. 아무도받지 못합니다. 나는 분명히 할 것이다. – gae123

+0

중요하지는 않지만'bk = blobstore.BlobKey (bk)'줄을 제거하면 어떻게됩니까? (또한 마지막 단락을 제외한 모든 어설트)? – alex

답변

4

불행하게도, 문서에 따라, 당신은 GCS 파일에 대한 BlobInfo 개체를 얻을 수 없습니다.

https://developers.google.com/appengine/docs/python/blobstore/#Python_Using_the_Blobstore_API_with_Google_Cloud_Storage

: 당신은 GCS 개체의 blobKey를 취득하면, 당신이 그것을 직렬화, 주위를 통과하고 그렇지 않으면 당신은 Blob 저장소에 저장된 개체에 대한 blobKey을 사용할 수 있습니다 교환 어디서나 사용할 수 있습니다. 이것은 앱이 일부 데이터를 blobstore에 저장하고 일부 데이터를 GCS에 저장하지만 나머지 데이터는 동일하게 취급하는 용도로 사용됩니다. 는 (단, BlobInfo 객체는 GCS 개체에 대한 현재 사용할 수 없습니다.)

그것은 로컬 모드 또는 프로덕션 환경에서 blobInfo를 사용하는 경우 GAE는 다른 행동을 가지고 짜증
+0

감사합니다. 이것이 제가 찾고 있던 것입니다. 나는이 섹션을주의 깊게 읽었으며 강조 표시된 것을 회상하지는 않았지만 실제로 거기에있다. 나는 정확히 그것이 언제 추가되었는지에 관해 궁금하게 생각하고있다 :-) – gae123

+2

그래도 나를 붙잡 았어. 언급 할만한 가치가있는 약간의 예외가 있습니다. BlobStore API를 사용하여 파일을 GCS 버킷에 업로드하면 BlobInfo를 가져 오는 데 사용할 수있는 BlobKey가 생성됩니다. 이는 BlobStore API가 BlobInfo를 작성하기 때문입니다.이 인스턴스에서는 원래 BlobKey와 GCS 객체 이름을 모두 저장하므로 BlobInfo를 얻을 수 있습니다. 이 BlobKey가 create_gs_key()에서 얻은 것과 동일하지 않다는 점은 주목할 가치가 있습니다. – OniMitch

1

오늘 정확히 똑같은 문제가 발생했으며 Google 클라우드 저장소를 사용할 때 blobstore API의 버그와 매우 흡사합니다.

blobstore API를 활용하기보다는 Google 클라우드 스토리지 클라이언트 라이브러리를 사용했습니다. 이 라이브러리는 여기에서 다운로드 할 수 있습니다 https://developers.google.com/appengine/docs/python/googlecloudstorageclient/download

는 GCS의 파일에 액세스하려면 :

import cloudstorage as gcs 

with gcs.open(GCSFileName) as f: 
    blob_content = f.read() 
    print blob_content 
+0

물론이 작업을 수행 할 수 있지만 이미 BlobInfos를 사용하는 많은 소스 코드가 있으며 마이그레이션을 원했습니다. 최소 변경 횟수를 만듭니다. – gae123

+0

@ gae123 전적으로 동의 합니다만, 지금까지는 내 연구 결과가 이것이 가능하지 않다는 것을 보여줍니다. 그렇지 않으면이 스레드를 업데이트하십시오. – Jesse

0

, 그것을 알아낼 걸 렸어요, 그러나 쉬운 해결책은 다음과 같습니다.

blob_key가있을 때 blobReader를 사용하여 데이터에 액세스 할 수 있습니다.

def getBlob(blob_key): 
    logging.info('getting blob('+blob_key+')') 

    with blobstore.BlobReader(blob_key) as f: 
    data_list = [] 
    chunk = f.read(1000) 
    while chunk != "": 
     data_list.append(chunk) 
     chunk = f.read(1000) 

    data = "".join(data_list) 

    return data` 

https://developers.google.com/appengine/docs/python/blobstore/blobreaderclass

관련 문제