2012-02-03 4 views
1

AppEngine을 사용하여 일부 Python 객체를 내 앱에 저장하고 있습니다. 이 파일을 사용자에게 직접 제공하고 싶습니다. X-AppEngine-Blobkey 헤더를 사용하여 file.pickle.gz 파일 이름으로 파일을 사용자에게 제공하기 만하면됩니다. 그러나, 간단한 두 번 클릭을 사용하여 내 컴퓨터 (Mac OS)에서 추출하려고하면 파일은 file.pickle.gz.cpgz이됩니다.Appengine은 gzipped 파일을 제공합니다.

나는 내 브라우저 몰래되고 그들을 추출라고 생각하지,하지만 난 그렇게 생각하지 않아요,

이후
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

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"라는 파일은 적어도 Chrome에서는 ~/Downloads/ 폴더로 다운로드됩니다. 두 번 클릭하면 "get"이라는 파일이 생성됩니다. 그 다음 :

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

당신이 옳습니다, 제 코드가 작동했습니다. "다시 켜 봤니?" – noio

관련 문제