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