【问题标题】:Google App Engine won't put object on server, but works on local versionGoogle App Engine 不会将对象放在服务器上,但适用于本地版本
【发布时间】:2013-11-09 05:31:31
【问题描述】:

当我尝试通过 Web 表单将图像 (blob) 和一些其他数据发布到数据存储区时,我在 Google App Engine 上遇到以下错误。该代码适用于我的本地计算机,但在我上传到 GAE 环境时不起作用。 :

<type 'str'> has type <type 'str'>, but expected one of: int, long, bool
Traceback (most recent call last):
  File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 1535, in __call__
    rv = self.handle_exception(request, response, e)
  File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 1529, in __call__
    rv = self.router.dispatch(request, response)
  File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 1278, in default_dispatcher
    return route.handler_adapter(request, response)
  File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 1102, in __call__
    return handler.dispatch()
  File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 572, in dispatch
    return self.handle_exception(e, self.app.debug)
  File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/webapp2-2.5.2/webapp2.py", line 570, in dispatch
    return method(*args, **kwargs)
  File "/base/data/home/apps/s~mygrajj/1.371507856337629790/main.py", line 123, in post
    car.put()
  File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/model.py", line 3232, in _put
    return self._put_async(**ctx_options).get_result()
  File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/tasklets.py", line 325, in get_result
    self.check_success()
  File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/tasklets.py", line 368, in _help_tasklet_along
    value = gen.throw(exc.__class__, exc, tb)
  File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/context.py", line 748, in put
    key = yield self._put_batcher.add(entity, options)
  File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/tasklets.py", line 371, in _help_tasklet_along
    value = gen.send(val)
  File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/context.py", line 280, in _put_tasklet
    keys = yield self._conn.async_put(options, datastore_entities)
  File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/datastore/datastore_rpc.py", line 1574, in async_put
    pbs = [self.__adapter.entity_to_pb(entity) for entity in entities]
  File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/model.py", line 570, in entity_to_pb
    pb = ent._to_pb()
  File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/model.py", line 2945, in _to_pb
    prop._serialize(self, pb, projection=self._projection)
  File "/base/data/home/runtimes/python27/python27_lib/versions/1/google/appengine/ext/ndb/model.py", line 1297, in _serialize
    p.set_multiple(self._repeated or parent_repeated)
  File "cpp_message.pyx", line 124, in cpp_message.SetScalarAccessors.Setter (third_party/apphosting/python/protobuf/proto1/cpp_message.cc:2229)
TypeError: <type 'str'> has type <type 'str'>, but expected one of: int, long, bool

尝试执行以下代码时:

class AddCar(blobstore_handlers.BlobstoreUploadHandler, webapp2.RequestHandler):
    def post(self):
        car = Car()
        if self.get_uploads('file'):
            upload_files = self.get_uploads('file')  # 'file' is file upload field in the form
            blob_info = upload_files[0]
            car.CarBlobKey = blob_info.key()
            car.CarImageServingURL.append(images.get_serving_url(blob_info.key()))
        car.CarYear = self.request.get('modelyear0')+self.request.get('modelyear1')+self.request.get('modelyear2')
        car.CarMake = self.request.get('makeField')
        car.CarModel = self.request.get('modelField')
        car.CarPosterGrajjStatus = self.request.get('which_grajj')
        if users.get_current_user():
            car.CarPoster = users.get_current_user()
        car.put()
        #grajj_query = Car.query()
        #cars = grajj_query.fetch(100)
        self.redirect('/mygrajj.html')

这是我的模型:

class Car(ndb.Model):
    # Car class contains data on a prototype car
    CarYear = ndb.StringProperty()
    CarMake = ndb.StringProperty()
    CarModel = ndb.StringProperty()
    CarPoster = ndb.UserProperty()
    CarPosted = ndb.DateTimeProperty(auto_now_add="true")
    CarPosterGrajjStatus = ndb.StringProperty()
    CarBlobKey = ndb.BlobKeyProperty(indexed="false")
    CarImageServingURL = ndb.StringProperty(indexed="false", repeated="true")

代码在我的本地机器上运行,但在部署时却不行

【问题讨论】:

  • 模型Car的定义是什么样的?
  • class Car(ndb.Model): # Car class contains data on a prototype car CarYear = ndb.StringProperty() CarMake = ndb.StringProperty() CarModel = ndb.StringProperty() CarPoster = ndb.UserProperty() CarPosted = ndb.DateTimeProperty(auto_now_add="true") CarPosterGrajjStatus = ndb.StringProperty() CarBlobKey = ndb.BlobKeyProperty(indexed="false") CarImageServingURL = ndb.StringProperty(indexed="false", repeated="true")
  • 对不起,在 cmets 中有点乱,但模型也在原帖中。

标签: python google-app-engine python-2.7


【解决方案1】:

如何删除 blob 并找出问题所在。

【讨论】:

  • 所以这行看起来很邪恶:car.CarImageServingURL.append(images.get_serving_url(blob_info.key()))
  • 插入那条线,它就断了。线路消失了,它就可以工作了。脑痛
【解决方案2】:

我认为这一行将引用NoneType,因为CarImageServingURL 没有默认值。

car.CarImageServingURL.append(images.get_serving_url(blob_info.key()))

你可以改写成

car.CarImageServingURL = images.get_serving_url(blob_info.key())

或者尝试将定义更改为默认值:

CarImageServingURL = ndb.StringProperty(indexed="false", repeated="true", default="")

【讨论】:

    【解决方案3】:

    您需要将所有参数更改为布尔值

    class Car(ndb.Model):
      # Car class contains data on a prototype car
      CarYear = ndb.StringProperty()
      CarMake = ndb.StringProperty()
      CarModel = ndb.StringProperty()
      CarPoster = ndb.UserProperty()
      CarPosted = ndb.DateTimeProperty(auto_now_add="true")
      CarPosterGrajjStatus = ndb.StringProperty()
      CarBlobKey = ndb.BlobKeyProperty(indexed="false")
      CarImageServingURL = ndb.StringProperty(indexed="false", repeated="true")
    
    auto_now_add=True
    indexed=False
    repeated=True
    

    省略“”

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-10
      • 2015-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-09
      • 2016-12-18
      • 1970-01-01
      相关资源
      最近更新 更多