我正在为google app engine使用python标准框架,并且在从模型获取属性时遇到了问题。
下面是我正在使用的“文章”模型的模型类:
class Article(ndb.Model):
# Entry metadata
timestamp = ndb.KeyProperty(kind='Timestamp', repeated=True)
# Article metadata
authors = ndb.KeyProperty(kind='Author', repeated=True)
title = ndb.StringProperty(indexed=False)
journal = ndb.StringProperty(indexed=False)
volume = ndb.StringProperty(indexed=False)
number = ndb.StringProperty(indexed=False)
pages = ndb.StringProperty(indexed=False)
year = ndb.IntegerProperty(indexed=True)
publisher = ndb.StringProperty(indexed=False)
# Methodology
methodology = ndb.KeyProperty(kind='Methodology')
learning_goals = ndb.KeyProperty(kind='LearningGoal', repeated=True, indexed=True)
# Summary data
type = ndb.StringProperty(indexed=True,choices=['Theoretical','Empirical','Review Article','Taxonomy Development','Practitioner', 'Other'], repeated=True)
star = ndb.BooleanProperty(indexed=True,default=False)
purpose = ndb.TextProperty(default="")
findings = ndb.TextProperty(default="")
recommendations = ndb.StringProperty(default="")
citation = ndb.TextProperty(default="")
audience = ndb.StringProperty(choices=['Practitioner', 'Researcher', 'Developer', 'Administrator', 'Other'], repeated=True)
@property
def author_names(self):
return ndb.get_multi(self.authors)
@property
def _methodology(self):
if self.methodology == None:
methodology = Methodology()
self.methodology = methodology.key
else:
methodology = self.methodology.get()
return methodology
@property
def _learning_goal(self):
return ndb.get_multi(self.learning_goals)
我遇到的问题是,由于某种原因,我的处理程序无法识别所有的模型属性。我的处理程序类如下:
class ArticleCategoryHandler(webapp2.RequestHandler):
def get(self,key):
""" This is """
article = ndb.Key(urlsafe=key).get()
logging.info(article)
logging.info('\n')
template_values = {
'key': key,
'application_url': self.request.application_url,
'user': users.get_current_user(),
'url': users.create_logout_url(self.request.uri),
'url_linktext': "Logout",
'article': article,
'categories': ['summary','learning-goals','methodology']
}
template = JINJA_ENVIRONMENT.get_template('templates/admin_category.html')
self.response.write(template.render(template_values))
对于特定的文章,logging.info(文章)列出了learning_goals属性。但是,当我尝试执行logging.info(article.learning_goals)或logging.info(article._learning_goal)时,出现以下错误:
Traceback (most recent call last):
File "/home/noah-banholzer/summer_research_2017/google-cloud-sdk/platform/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 1535, in __call__
rv = self.handle_exception(request, response, e)
File "/home/noah-banholzer/summer_research_2017/google-cloud-sdk/platform/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 1529, in __call__
rv = self.router.dispatch(request, response)
File "/home/noah-banholzer/summer_research_2017/google-cloud-sdk/platform/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 1278, in default_dispatcher
return route.handler_adapter(request, response)
File "/home/noah-banholzer/summer_research_2017/google-cloud-sdk/platform/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 1102, in __call__
return handler.dispatch()
File "/home/noah-banholzer/summer_research_2017/google-cloud-sdk/platform/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 572, in dispatch
return self.handle_exception(e, self.app.debug)
File "/home/noah-banholzer/summer_research_2017/google-cloud-sdk/platform/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 570, in dispatch
return method(*args, **kwargs)
File "/home/noah-banholzer/summer_research_2017/everydaycomputing.org/site_database/admin_category.py", line 22, in get
logging.info(article.learning_goals)
AttributeError: 'Article' object has no attribute 'learning_goals'
我已经确保文章的LearningGoal属性被编入索引,并在本地开发服务器和实时应用程序上检查了这一点。由于某些原因,当我尝试在本地开发服务器的交互式控制台中执行类似的查询时,它识别出文章的learning_goals属性。此外,它还识别文章模型的所有其他属性(即方法、标题等)。还有人遇到过这个问题吗?
谢谢!
发布于 2017-08-10 03:07:26
服务在代码级完全相互隔离。来自App Engine Services as microservices
在App Engine项目中,您可以将多个微服务部署为单独的services,以前在App Engine中称为模块。这些服务具有完全的代码隔离;在这些服务中执行代码的唯一方法是通过HTTP调用,例如用户请求或RESTful应用编程接口调用。一个服务中的代码不能直接调用另一个服务中的代码。代码可以独立部署到服务中,不同的服务可以用不同的语言编写,例如Python、Java、Go和PHP。自动伸缩、负载均衡和机器实例类型都是独立管理的服务。
这意味着您必须显式地实现一种在需要访问相同实体类型的不同服务之间共享数据存储模型的方法。
我的建议是在每个服务中使用符号链接的模型定义的文件,请参阅Sharing entities between App Engine modules,也许还有Communicating between google app engine services。
非常重要的一点是,无论何时模型发生变化,都要重新部署共享模型的所有服务,否则,未重新部署的服务将使用过时的模型定义运行,从而为您报告的错误留下空间。
https://stackoverflow.com/questions/45598161
复制相似问题