Change to blobstore/get_serving_url?

295 views
Skip to first unread message

Richard Arrano

unread,
Aug 21, 2012, 6:14:51 PM8/21/12
to google-a...@googlegroups.com
Hello,
I have a function that takes a user image upload and saves both the blob key and a serving URL. After upgrading to 1.7.1, I now get an error trying to save the updated entity to the datastore. The property pictures is an ndb.StringProperty(repeated=True, indexed=False) and the property picture_keys is an ndb.BlobKeyProperty(repeated=True) where the former will hold the image serving URLs for the blob keys in the latter. In a transaction, I read the uploaded file and generate a serving URL and save the blob key and the serving URL. This worked last night before upgrading to 1.7.1, but now I get an error on:
 
    article.pictures.append(get_serving_url(blob_info.key()))
 
AttributeError: 'Entity' object has no attribute '_to_pb'
 
Without fail on the development server, this line now generates that error. Was there a change to the API and I should be doing something differently? If so, what?
 
Thanks,
Richard

Takashi Matsuo

unread,
Aug 21, 2012, 9:59:25 PM8/21/12
to google-a...@googlegroups.com

Can you show me the whole stacktrace?
What is your app-id?


--
You received this message because you are subscribed to the Google Groups "Google App Engine" group.
To view this discussion on the web visit https://groups.google.com/d/msg/google-appengine/-/Bg4zC34iDOcJ.
To post to this group, send email to google-a...@googlegroups.com.
To unsubscribe from this group, send email to google-appengi...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/google-appengine?hl=en.



--
Takashi Matsuo | Developers Advocate | tma...@google.com

Frank VanZile

unread,
Aug 22, 2012, 1:25:30 AM8/22/12
to google-a...@googlegroups.com
Here is my stack of the same problem.

  File "C:\work\twist.2\server\backend\lib\images\image_helper.py", line 18, in
get_serving_url
    return images.get_serving_url(image_blob_key)
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\api\imag
es\__init__.py", line 1793, in get_serving_url
    return rpc.get_result()
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\api\apip
roxy_stub_map.py", line 604, in get_result
    return self.__get_result_hook(self)
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\api\imag
es\__init__.py", line 1889, in get_serving_url_hook
    rpc.check_success()
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\api\apip
roxy_stub_map.py", line 570, in check_success
    self.__rpc.CheckSuccess()
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\api\apip
roxy_rpc.py", line 156, in _WaitImpl
    self.request, self.response)
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\api\apip
roxy_stub.py", line 160, in MakeSyncCall
    method(request, response)
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\api\imag
es\images_stub.py", line 296, in _Dynamic_GetUrlBase
    datastore.Put(entity_info)
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\api\data
store.py", line 579, in Put
    return PutAsync(entities, **kwargs).get_result()
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\api\data
store.py", line 556, in PutAsync
    return _GetConnection().async_put(config, entities, local_extra_hook)
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\datastor
e\datastore_rpc.py", line 1534, in async_put
    pbs = [self.__adapter.entity_to_pb(entity) for entity in entities]
  File "C:\work\twist.2\server\backend\lib\external\ndb\model.py", line 561, in
entity_to_pb
    pb = ent._to_pb()

AttributeError: 'Entity' object has no attribute '_to_pb'


i have ran into the same type of problem before.  the problem is the sdk tries to cache the datastore_rpc connection.  see _GetConnection in datastore.py

def _GetConnection():
  """Retrieve a datastore connection local to the thread."""

  connection = None
  if os.getenv(_ENV_KEY):
    try:
      connection = _thread_local.connection
    except AttributeError:
      pass
  if connection is None:
    connection = datastore_rpc.Connection(adapter=_adapter)
    _SetConnection(connection)
  return connection

an incorrect datastore connection is being used for that call from this connection cache.

you can hack around it by adding this before the get_serving_url call. 

            import os
            from google.appengine.api import datastore
            os.environ[datastore._ENV_KEY] = ''
            os.putenv(datastore._ENV_KEY, '')
            datastore._thread_local.connection = None

Richard Arrano

unread,
Aug 22, 2012, 2:20:50 AM8/22/12
to google-a...@googlegroups.com
Frank,
Thanks for the tip and for debugging that issue. I was completely lost. However, when I try your workaround, despite that my IDE can see that os has a function called putenv, for some reason App Engine does not. I get this error trying it that way:
 
os.putenv(datastore._ENV_KEY, "")
AttributeError: 'module' object has no attribute 'putenv'
 
Any idea on how to mitigate this? I have imported os but this is extremely strange. I'm on 2.7.3 and am able to use putenv in my own interpreter.
 
Thanks,
Richard

Frank VanZile

unread,
Aug 22, 2012, 1:33:39 PM8/22/12
to google-a...@googlegroups.com
from http://docs.python.org/library/os.html putenv should exist. just comment out the putenv and try it.  the hack to get _GetConnection not return an existing connection so it will create the correct connection needed for the
get_serving_url call.
Reply all
Reply to author
Forward
0 new messages