Appengine обслуживать сжатые файлы - PullRequest
1 голос
/ 03 февраля 2012

Я использую AppEngine для хранения некоторых маринованных объектов Python в моем приложении.Я хочу передать их пользователю напрямую, и я просто использую заголовок X-AppEngine-Blobkey, чтобы передать файлы пользователю с именем file.pickle.gz.Однако, когда я пытаюсь извлечь их на моем компьютере (Mac OS) с помощью простого двойного щелчка, файлы превращаются в file.pickle.gz.cpgz.

Я думал, что мой браузер подлый и извлекает их, но я так не думаю, поскольку

pickle.load('file.pickle.gz')

не работает и не работает

pickle.load('file.pickle.gz.cpgz') 

Для хранения файлов я использую:

    blobfile = files.blobstore.create(mime_type='application/gzip')
    with files.open(blobfile, 'a') as f:
        gz = gzip.GzipFile(fileobj=f,mode='wb')
        gz.write(my_pickled_object)
        gz.close()
    files.finalize(blobfile)

Мне кажется, я не понимаю, как работают gzips.Может кто-нибудь объяснить?

1 Ответ

1 голос
/ 04 февраля 2012

Вы уверены, что file.pickle.gz.cpgz - это результат двойного щелчка по загруженному файлу file.pickle.gz?Обычно ".cpgz" - это другой тип архивного файла.

Я могу получить отправленный вами код для работы на сервере разработки без существенных изменений.Вот код, если он помогает:

#!/usr/bin/env python

from __future__ import with_statement
import gzip
import pickle
from google.appengine.api import files
from google.appengine.api import memcache
from google.appengine.ext import blobstore
from google.appengine.ext import webapp
from google.appengine.ext.webapp import blobstore_handlers
from google.appengine.ext.webapp import util

class MainHandler(webapp.RequestHandler):
    def get(self):
        self.response.out.write('Hello world! <a href="/make">make</a> <a href="/get">get</a>')

class MakeFileHandler(webapp.RequestHandler):
    def get(self):
        data = pickle.dumps({'a':1, 'b':True, 'c':None})

        blobfile = files.blobstore.create(mime_type='application/gzip')
        with files.open(blobfile, 'a') as f:
            gz = gzip.GzipFile(fileobj=f,mode='wb')
            gz.write(data)
            gz.close()
        files.finalize(blobfile)
        memcache.set('filekey', files.blobstore.get_blob_key(blobfile))
        self.redirect('/')

class GetFileHandler(blobstore_handlers.BlobstoreDownloadHandler):
    def get(self):
        blobkey = memcache.get('filekey')
        if blobkey:
            self.send_blob(blobkey)
        else:
            self.response.out.write('No data key set <a href="/">back</a>')

def main():
    application = webapp.WSGIApplication([('/', MainHandler),
                                          ('/make', MakeFileHandler),
                                          ('/get', GetFileHandler)],
                                         debug=True)
    util.run_wsgi_app(application)

if __name__ == '__main__':
    main()

Нажмите «make», затем нажмите «get».Файл с именем "get.gz" загружается в вашу папку ~/Downloads/ (по крайней мере, в Chrome).Дважды щелкните по нему, чтобы создать файл с именем «get».Тогда:

% python
>>> import pickle
>>> pickle.load(open('get'))
{'a': 1, 'c': None, 'b': True}
...