3

我想從一個json文件使用taskqueue和延期導入到數據存儲的大型用戶信息列表。blobstore在一個taskqueue /推遲

A User包含用戶信息,包括來自不同應用的圖片網址。在導入過程中,圖像應該被抓取並上傳到blob(測試時工作正常)。

我陷入了上傳圖像的blob_key。 而且我認爲它只發生在taskqueue/deferred內部,因爲我在'普通'GET請求處理程序中嘗試了它,它工作得很好。

這是我的處理程序:

class MigrationTask(BaseHandler): 
    def post(self): 
     if not self.request.get('file'): 
      return 
     json_data = open(self.request.get('file')) 
     data = json.load(json_data) 
     json_data.close() 

     for datum in data['results']: 
      deferred.defer(push_user_to_db, datum) 

這是我的功能:追蹤的

@ndb.transactional(xg=True) 
def _push_user_to_db(profilePicture=None, ...): 
    if profilePicture: 
     if 'url' in profilePicture: 
      con = urlfetch.fetch(image_url) 
      if con.status_code == 200: 
       file_name = files.blobstore.create(mime_type='application/octet-stream') 
       with files.open(file_name, 'a') as f: 
        f.write(con.content) 
       files.finalize(file_name) 
       blob_key = files.blobstore.get_blob_key(file_name) # this part is where it errs 
       image_url = images.get_serving_url(file_name) 

    # some codes here... 

def push_user_to_db(kwargs): 
    _push_user_to_db(**kwargs) 

部分:

blob_key = files.blobstore.get_blob_key(file_name) 

    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\api\files\blobstore.py", line 132, in get_blob_key 

    namespace='')])[0] 

    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\api\datastore.py", line 654, in Get 

    return GetAsync(keys, **kwargs).get_result() 

    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\api\datastore.py", line 629, in GetAsync 

    return _GetConnection().async_get(config, keys, local_extra_hook) 

    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\datastore\datastore_rpc.py", line 1574, in async_get 

    pbs = [key_to_pb(key) for key in keys] 

    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\ndb\model.py", line 653, in key_to_pb 

    return key.reference() 

AttributeError: 'Key' object has no attribute 'reference' 

PS:我也試着任務隊列,而不是推遲。

EDIT(1):

這是回溯:

ERROR 2015-03-03 06:32:44,720 webapp2.py:1552] 'Key' object has no attribute 'reference' 

Traceback (most recent call last): 

    File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 1535, in __call__ 

    rv = self.handle_exception(request, response, e) 

    File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 1529, in __call__ 

    rv = self.router.dispatch(request, response) 

    File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 1278, in default_dispatcher 

    return route.handler_adapter(request, response) 

    File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 1102, in __call__ 

    return handler.dispatch() 

    File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 572, in dispatch 

    return self.handle_exception(e, self.app.debug) 

    File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 570, in dispatch 

    return method(*args, **kwargs) 

    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\deferred\deferred.py", line 310, in post 

    self.run_from_request() 

    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\deferred\deferred.py", line 305, in run_from_request 

    run(self.request.body) 

    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\deferred\deferred.py", line 147, in run 

    return func(*args, **kwds) 

    File "C:\project directory\migration.py", line 141, in push_user_to_db 

    _push_user_to_db(**kwargs) 

    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\ndb\utils.py", line 179, in inner_wrapper 

    return wrapped_decorator(func, args, kwds, **options) 

    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\ndb\model.py", line 3759, in transactional 

    func, args, kwds, **options).get_result() 

    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\ndb\tasklets.py", line 325, in get_result 

    self.check_success() 

    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\ndb\tasklets.py", line 371, in _help_tasklet_along 

    value = gen.send(val) 

    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\ndb\context.py", line 999, in transaction 

    result = callback() 

    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\ndb\model.py", line 3767, in <lambda> 

    return transaction_async(lambda: func(*args, **kwds), **options) 

    File "C:\project directory\migration.py", line 56, in _push_user_to_db 

    blob_key = files.blobstore.get_blob_key(file_name) 

    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\api\files\blobstore.py", line 132, in get_blob_key 

    namespace='')])[0] 

    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\api\datastore.py", line 654, in Get 

    return GetAsync(keys, **kwargs).get_result() 

    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\api\datastore.py", line 629, in GetAsync 

    return _GetConnection().async_get(config, keys, local_extra_hook) 

    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\datastore\datastore_rpc.py", line 1574, in async_get 

    pbs = [key_to_pb(key) for key in keys] 

    File "C:\Program Files (x86)\Google\google_appengine\google\appengine\ext\ndb\model.py", line 653, in key_to_pb 

    return key.reference() 

AttributeError: 'Key' object has no attribute 'reference' 
+0

問題出在你的''model.py'的第653行,但你不顯示那個部分。 – 2015-03-02 21:49:21

+0

@Kekito我認爲'model.py'來自GAE的NDB Datastore API。 我添加了全部回溯以供參考。 感謝您的幫助,我非常感謝:) – 2015-03-03 06:46:10

回答

1

注意!使用文件api將文件寫入Blobstore已被棄用。我之前有過這個問題。我的代碼在開發服務器(localhost)中運行得非常好,但在App Engine服務器上出錯。解決方案是通過Blobstore API將文件寫入Google Cloud Storage

+0

感謝您的領導:) – 2015-03-25 10:20:24