Замена файла магазина - PullRequest
2 голосов
/ 22 января 2012

Я передаю статический KML из хранилища больших двоичных файлов в качестве файла, который я сохранил в хранилище больших двоичных объектов

class KMLHandler2(blobstore_handlers.BlobstoreDownloadHandler):

    def get(self):
        resource = 'AMIfv965WtxAc_rWOVjSSx423_oe6f-g5obWYNKX5scg-1gqvISyaZCnv6lRaqro2wOVNOogttyMOylFLsRYZ3Y9UYIe-A69vAt4pdJB2-SHUcdVEM2v0XVLxzT3fTlxwXQVhzmsHPwALH_rCSFIvmYcuV37asVD0Q'
        resource = str(urllib.unquote(resource))
        blob_info = blobstore.BlobInfo.get(resource)
        self.send_blob(blob_info)

Это работает, но я хочу регулярно обновлять файл.Файл сгенерирован из /list.kml, так что я мог прочитать его прямо оттуда, но затем он истекает, поэтому я планирую сделать свою первую вспомогательную задачу, которая читает файл из list.kml и записывает его в хранилище BLOB-объектов с тем же ключом, нокак мне это сделать, когда единственными примерами являются как создать новый файл?У меня есть места в коде, где я обновляю слой данных, и это не очень часто.Можете ли вы предложить, как я должен делать, когда я обновляю файл?Я полагаю, что я хочу, чтобы ключ и идентификатор были одинаковыми, и заменили старый блоб вместо того, чтобы писать новый и обновлять ключ.Вы можете мне помочь?Документы движка приложения говорят о том, как написать файл магазина блогов, но только новый, я не знаю, как редактировать или заменить файл, учитывая его ключ, и я думаю, что это то, что мне нужно сделать как задачу или задание cron, так чтоЯ прошу вашей помощи.

Я мог бы создать обработчик, как в документах, но это для создания файла, а не его изменения / замены:

class CreateKMLHandler(webapp2.RequestHandler):
    def get(self):
        # Create the file
        file_name = files.blobstore.create(mime_type='application/octet-stream')

        # Open the file and write to it
        with files.open(file_name, 'a') as f:
          f.write('data')

        # Finalize the file. Do this before attempting to read it.
        files.finalize(file_name)

        # Get the file's blob key
        blob_key = files.blobstore.get_blob_key(file_name)

Спасибо

Обновление

Я пытаюсь использовать этот код для создания нового файла, но при этом возникает ошибка приложения крайнего срока, ошибка 5, которая, как я полагаю, является проблемой тайм-аута.Как я могу сделать это вместо этого?

class CreateKMLHandler(webapp2.RequestHandler):
    def get(self):
        # Create the file
        file_name = files.blobstore.create(mime_type='application/octet-stream')

        url = 'http://montaoproject.appspot.com/list.kml'

        result = urlfetch.fetch(url)
        if not result.content:
            return

        # Open the file and write to it
        with files.open(file_name, 'a') as f:
          f.write(result.content)

        # Finalize the file. Do this before attempting to read it.
        files.finalize(file_name)

        # Get the file's blob key
        blob_key = files.blobstore.get_blob_key(file_name)
        self.out.write(blob_key)

1 Ответ

2 голосов
/ 23 января 2012

После того, как BLOB-объекты были записаны, их нельзя изменить (только для чтения или удаления). Вы можете использовать сущности хранилища данных для отслеживания текущего ключа BLOB-объекта, связанного с данным документом KML.

Возможно, вас также заинтересует API-интерфейс облачного хранилища (http://code.google.com/appengine/docs/python/googlestorage/overview.html), который позволяет перезаписывать объекты «корзины», создавая новые объекты с тем же именем.

...