GAE NDB AttributeError模型实例没有属性

时间:2014-12-20 20:50:11

标签: python google-app-engine google-cloud-datastore google-cloud-endpoints

我有一个名为' Bin'的Google App Engine NDB模型。 我修改了' Bin'并删除了与旧型号对应的所有数据条目。我的目标是查询所有垃圾箱并访问属性'标签'在GAE端点功能内部。但是,当查询并迭代返回的列表时,我得到AttributeError: 'Bin' object has no attribute 'label',这显然是错误的。日志输出显示返回的列表确实包含两个Bin对象,这些对象具有名为' label'。

的属性。

有趣的是,当我更改查询周围的代码时,代码将在下次运行时正常运行。然后又失败了。

我已清除内存缓存,重新启动应用引擎启动器并删除所有条目(然后添加新条目)以尝试删除任何缓存。

NDB模型

class Bin(ndb.Model):
    id=ndb.IntegerProperty(required=True)
    label=ndb.StringProperty(required=True)
    items=ndb.JsonProperty()

查询

import endpoints
from protorpc import messages
from protorpc import message_types
from protorpc import remote
from includes.models import Bin
...
@endpoints.api(name='iwora', version='v1')
class Api(remote.Service):
    @endpoints.method(message_types.VoidMessage, BinCollection,
    path='bin', http_method='GET',
    name='bin.all')
    def bin_all(self, request):
        self.user_required()

        namespace = namespace_manager.get_namespace()
        try:
            namespace_manager.set_namespace(self.user.active_org)
            bins = Bin.query().fetch()
            logging.info('BINS: %s' % bins)
            binsresponse = []
            for bin in bins:
                logging.info('BIN: %s' % bin)
                obj = {
                    'label': bin.label # error happens here
                }
                binsresponse.append(obj)
        finally:
            namespace_manager.set_namespace(namespace)

        return BinCollection(bins=binsresponse)
...

当查询运行并且我尝试遍历返回的bin时,我得到以下输出:

  

BINS:[Bin(key = Key(' Bin',' default_bin',' Bin',5275456790069248),   id = 2L,items = None,label =' 1-1-2'),Bin(key = Key(' Bin',' default_bin',   ' Bin',5838406743490560),id = 1L,items = None,label =' 1-1-1')]       BIN:Bin(键=键(' Bin',' default_bin',' Bin',5275456790069248),id = 2L,items = None,label =&# 39; 1-1-2')       从ProtoRPC方法实现中遇到意外错误:AttributeError(' Bin'对象没有属性'标签')       Traceback(最近一次调用最后一次):       文件" /Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/protorpc-1.0/protorpc/wsgi/service.py",   第181行,在protorpc_service_app中       response =方法(实例,请求)       文件" /Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-   default.bundle /内容/资源/ google_appengine / LIB /端点-1.0 /端点/ api_config.py&#34 ;,   第1332行,在invoke_remote中       return remote_method(service_instance,request)       文件" /Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/protorpc-1.0/protorpc/remote.py",   第412行,在invoke_remote_method中       response =方法(service_instance,request)       文件" /Users/rlfrahm/Apps/iwora/api.py" ;,第524行,在bin_all中       '标签':bin.label       AttributeError:' Bin'对象没有属性'标签'

我认为(正如我相信,但尚未确认)只有在我实现了模型,将条目添加到数据库中,然后通过更改属性名称或添加新属性来修改模型时才会发生这种情况。即使在删除条目后,我仍然会遇到此问题。我意识到这个问题在当前状态下是不可重复的,因为我不知道如何重现错误。它似乎只是发生了。"我有许多其他功能使用相同的过程,工作得很好。甚至SDK控制台中的交互式控制台也能正确返回。

因此,我真的很想知道是否有人看到过这种行为,或者看到我的流程出现了明显的错误?

1 个答案:

答案 0 :(得分:2)

这是尝试重现错误的最佳尝试 - 它包含了您与我们分享的所有稀疏代码片段,并且根本无法显示任何错误。

import logging
import webapp2
from google.appengine.ext import ndb

class Bin(ndb.Model):
    id=ndb.IntegerProperty(required=True)
    label=ndb.StringProperty(required=True)
    items=ndb.JsonProperty()

class MainHandler(webapp2.RequestHandler):
    def get(self):
        bins = Bin.query().fetch()
        if not bins:
            Bin(id=1L, items=None, label='1-1-1').put()
            Bin(id=2L, items=None, label='1-1-2').put()
            bins = Bin.query().fetch()
        logging.info('BINS: %s' % bins)
        binsresponse = []
        for bin in bins:
            logging.info('BIN: %s' % bin)
            obj = {
                'label': bin.label # error happens here
            }
            binsresponse.append(obj)

        self.response.write('Hello world! ')
        self.response.write(binsresponse)


app = webapp2.WSGIApplication([
    ('/', MainHandler)
], debug=True)

在SDK中本地运行此按预期显示:

Hello world! [{'label': u'1-1-2'}, {'label': u'1-1-1'}]

并且日志中的相关代码段为:

INFO     2014-12-21 03:15:56,721 main.py:19] BINS: [Bin(key=Key('Bin', 5066549580791808), id=2, items=None, label=u'1-1-2'), Bin(key=Key('Bin', 5629499534213120), id=1, items=None, label=u'1-1-1')]
INFO     2014-12-21 03:15:56,721 main.py:22] BIN: Bin(key=Key('Bin', 5066549580791808), id=2, items=None, label=u'1-1-2')
INFO     2014-12-21 03:15:56,722 main.py:22] BIN: Bin(key=Key('Bin', 5629499534213120), id=1, items=None, label=u'1-1-1')

IOW,没问题。

添加到这个微小的代码(其中包含您要发布的每一个最后一位! - )缺少什么使其重现您的错误,并编辑您的问题以包含最小的失败的例子 - 或者,放弃所有希望任何人都能帮助你调试你的错误! - )