У вас есть обработчик запросов для маршрута /data
, который делает что-то подобное?
from google.appengine.ext import blobstore
class DisplayBlob(blobstore_handlers.BlobstoreDownloadHandler):
def get(self):
blob_key = self.request.GET['key']
self.send_blob(ndb.BlobKey(blob_key))
self.response.headers['Content-Type'] = 'text/plain'
РЕДАКТИРОВАТЬ:
Хорошо, так что 404
Возможно, вы брошены этой строкой: self.error(404)
верно? Добавьте logging.warn('BlobstoreDataServer is throwing 404')
прямо перед тем, чтобы убедиться. Также вы видите эту строку logging.debug(k)
print (я хочу подтвердить, что BlobstoreDataServer
даже получает удар)? Вам может потребоваться сделать logging.getLogger().setLevel(logging.DEBUG)
, чтобы увидеть его.
Так что это означает, что blobstore.BlobInfo.get(k)
возвращает None
. Удостоверьтесь, что сначала все работает, вы можете сделать это в интерактивной консоли.
- Go до http://localhost: 8000 / blobstore
Откройте один из них и скопируйте ключ (
encoded_gs_file:dwndjndwamwljioih...
)
Go к Интерактивной консоли (
http://localhost: 8000 / console ) и введите этот код, нажмите «EXECUTE» и убедитесь, что он может его найти:
Если этот шаг не сработал, значит, что-то не так с эмулятором вашего магазина dev_appserver.py
Если это работает, просто вставьте этот же ключ вручную в конце ссылки на скачивание:
https://localhost:8080/data?key=<paste_encoded_gs_file_key_here>
Если этот шаг не сработал, значит, с обработчиком загрузки что-то не так, возможно, эта строка как-то преобразует ключ str(urllib.unquote(self.request.params.get('key','')))
Если этот шаг сработал, значит, что-то не так с вашим кодом, который генерирует эту ссылку https://localhost:8080/data?key=...
, возможно, вы на самом деле пишете в gcs_filename
, отличное от того, что вы создаете другой BlobKey
для.