хранилище данных использует BlobKey для загрузки - PullRequest
0 голосов
/ 07 февраля 2020

В хранилище данных Google Appengine есть BlobKey (обозначается как csv). Ключ имеет следующий формат: encoded_gs_file:we1o5o7klkllfekomvcndhs345uh5pl31l. Я хотел бы предоставить кнопку загрузки, чтобы сохранить эту информацию. Мой вопрос заключается в том, какую конечную точку я могу использовать для доступа к этому. Более подробная информация о BlobKey приведена ниже.

enter image description here

Веб-приложение запускается с использованием dev_appserver.py и использует python 2.7 (Django) в качестве бэкэнда. В настоящее время кнопка существует, но при нажатии на нее возвращается ошибка 404. Ссылка для скачивания, которую обеспечивает кнопка:

    https://localhost:8080/data?key=encoded_gs_file:dwndjndwamwljioihkm

enter image description here

Мой вопрос: как я могу использовать blobkey для генерации URL, который может быть скачано; или как я могу проверить свою базу кода, чтобы узнать, как генерируется URL, который я могу использовать?

class BlobstoreDataServer(blobstore_handlers.BlobstoreDownloadHandler):
    def get(self):
        k = str(urllib.unquote(self.request.params.get('key','')))
        logging.debug(k)
        blob_info = blobstore.BlobInfo.get(k)
        logging.debug(blob_info)
        if (not blob_info) or (not blob_info.size):
            self.error(404)
            return
        self.response.headers['X-Blob-Size'] = str(blob_info.size)
        self.response.headers['Content-Type'] = blob_info.content_type
        self.response.headers['Content-Disposition'] = (u'attachment; filename=%s' % blob_info.filename).encode('utf-8')
        self.send_blob(blob_info)

Редактировать: Новые изображения enter image description here enter image description here

1 Ответ

3 голосов
/ 07 февраля 2020

У вас есть обработчик запросов для маршрута /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. Удостоверьтесь, что сначала все работает, вы можете сделать это в интерактивной консоли.

  1. Go до http://localhost: 8000 / blobstore

enter image description here

Откройте один из них и скопируйте ключ (encoded_gs_file:dwndjndwamwljioih...)

enter image description here

Go к Интерактивной консоли (http://localhost: 8000 / console ) и введите этот код, нажмите «EXECUTE» и убедитесь, что он может его найти:

enter image description here

Если этот шаг не сработал, значит, что-то не так с эмулятором вашего магазина 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 для.

...