【问题标题】:How to initialize the datastore with a default entity in Google App Engine如何在 Google App Engine 中使用默认实体初始化数据存储区
【发布时间】:2014-10-11 19:47:24
【问题描述】:

假设我有一个特定的模型

class Page(db.Model):
    """ Model for storing wiki pages """
    page_name = db.StringProperty(required=True, default="/")
    content = db.StringProperty(required=True, default="")
    created = db.DateTimeProperty(auto_now = True)

我想做的是查询数据存储。如果没有基于此模型的实体,我想创建一个默认实体。或者,使用一个默认实体创建模型会很棒。

我知道 Python 中的 init 方法用于设置属性的初始值,但是当我在请求处理程序的 Get 方法中将它与 GAE 和 webapp2 一起使用时,我得到一个错误。

出错的代码是:

class WikiPage(Handler):
    def __init__(self):
        pass

我看到的错误是:

handler = self.handler(request, response)
TypeError: __init__() takes exactly 1 argument (3 given)

请指教

【问题讨论】:

标签: python google-app-engine webapp2


【解决方案1】:

不清楚你要做什么,但如果你只是想摆脱错误,你需要像这样定义 __init__ 方法:

class WikiPage(Handler):
    def __init__(self, *args, **kwargs):
        pass

更新以回答您的问题“为什么”:

因为您要覆盖继承自 RequestHandlerHandler 类的 __init__ 方法,如果您在此处查看其原始定义:https://code.google.com/p/webapp-improved/source/browse/webapp2.py#506,您会看到它的定义方式和这就是它在整个框架中的使用方式,这意味着如果您出于任何原因决定覆盖它,则需要遵循相同的格式。

【讨论】:

  • 你能解释一下为什么需要这样吗?
  • 是的,我确实看到了这个定义,但假设由于其他两个参数具有默认值,因此它们已被处理。我会测试并让你知道。愿你平安
  • @ImranNazir,是的,原始定义具有默认值,如果您愿意,也可以定义它们。您正在覆盖(完全替换)原始定义(因为您似乎没有调用super),因此在那里定义的任何内容都不再发挥任何作用。问题是一些其他代码(传入请求处理程序)正在将 3 参数传递给 __init__ 方法,但您对 __init__ 方法的实现只接受 one (self ) 这就是您的代码失败的原因。
  • 是的,我知道路由可以将参数传递给处理程序。我在 get 方法中以这种方式使用它们。在这种情况下,我的路线是: '(PAGE_RE, WikiPage)' where 'PAGE_RE = r'(/(?:[a-zA-Z0-9_-]+/?)*)'' 这应该传递给 get 方法在我的处理程序中,baseurl 之后的所有内容。这将是 1 个参数传递,而不是 3 个
猜你喜欢
  • 2010-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-03
  • 2020-07-03
相关资源
最近更新 更多