当前位置: 首页 > 面试题库 >

如何正确使用App Engine Python模型类的自定义__init__?

沈琛
2023-03-14
问题内容

我正在尝试实施延迟的博客帖子删除方案。因此, 您确定要 烦恼 吗? ,您有2分钟的时间取消删除。

我想跟踪在使用db.Model类( DeleteQueueItem )时将要删除的内容,因为我发现无法从队列中删除任务,并且怀疑我可以查询其中的内容。

创建 DeleteQueueItem 实体应自动设置 delete_when 属性并将任务添加到队列中。我将博客文章的相对路径用作其
key_name, 并且也希望在此处将其用作 key_name 。这导致了我的自定义 初始化

class DeleteQueueItem(db.Model):
    """Model to keep track of items that will be deleted via task queue."""

    # URL path to the blog post is handled as key_name
    delete_when = db.DateTimeProperty()

    def __init__(self, **kwargs):
        delay = 120  # Seconds
        t = datetime.timedelta(seconds=delay)
        deadline = datetime.datetime.now() - t
        key_name = kwargs.get('key_name')

        db.Model.__init__(self, **kwargs)
        self.delete_when = deadline

        taskqueue.add(url='/admin/task/delete_page', 
                      countdown=delay,
                      params={'path': key_name})

在我尝试删除实体之前,这似乎可行。

fetched_item = models.DeleteQueueItem.get_by_key_name(path)

失败的原因是:

TypeError: __init__() takes exactly 1 non-keyword argument (2 given)

我究竟做错了什么?


问题答案:

通常,您不应尝试覆盖Model类的 init
方法。尽管可能会正确,但正确的构造函数行为相当复杂,甚至在发行版之间可能会更改,从而破坏了代码(尽管我们尽量避免这样做!)。造成这种情况的部分原因是,您自己的代码,构造新模型和框架都必须使用构造函数,以重构从数据存储中加载的模型。

更好的方法是使用工厂方法,而不是构造方法调用。

另外,您可能想在编写实体的同时而不是在创建时添加任务。如果不这样做,最终会导致竞争:在将新实体存储到数据存储区之前,任务可能会执行!

这是建议的重构:

class DeleteQueueItem(db.Model):
    """Model to keep track of items that will be deleted via task queue."""

    # URL path to the blog post is handled as key_name
    delete_when = db.DateTimeProperty()

    @classmethod
    def new(cls, key_name):
        delay = 120  # Seconds
        t = datetime.timedelta(seconds=delay)
        deadline = datetime.datetime.now() - t

        return cls(key_name=key_name, delete_when=deadline)

    def put(self, **kwargs):
      def _tx():
        taskqueue.add(url='/admin/task/delete_page', 
                      countdown=delay,
                      params={'path': key_name},
                      transactional=True)
        return super(DeleteQueueItem, self).put(**kwargs)
      if not self.is_saved():
        return db.run_in_transaction(_tx)
      else:
        return super(DeleteQueueItem, self).put(**kwargs)


 类似资料:
  • 我想对自定义JFX组件进行子类化,以更改/扩展它们的行为。作为一个真实的例子,我想扩展一个具有编辑功能的data viewer组件。 考虑下面非常小的场景。使用类非常有效。但是当实例化子类(在FXML文件中)时,不再注入字段 会自动调用该方法。 我知道将超级组件嵌套在子组件中应该可以很好地工作,但是我仍然想知道使用继承是否可以做到这一点。 将的可见性扩大到显然无法解决此问题。在中结合定义扩展点(此

  • 问题内容: 我认为我的问题很简单,但是我找不到解决方案,所以我决定在这里提问。我需要做的是使用这样的自定义键类型: 但是,我在这里丢失了一些东西,因为停止功能正常。首先,密钥不是唯一的,并且可以在中找到具有相同值的Pair的不同实例。同样,包含键功能不能像我想象的那样起作用:)。 我显然错过了一些东西,并且更有可能应该以某种方式定义一种比较类中实例的方法。但是我在课堂上尝试实现Comparable

  • 问题内容: 我想将非spring bean类对象用作球衣Web服务类方法的参数。但是它在构建时会给出缺少的依赖项错误。 我的代码是: 问题答案: 关键是路径参数以字符串形式出现。根据规范,如果我们希望将自定义类型作为注入,则自定义类应具有以下三项之一: 返回类型的公共静态 返回类型的公共静态 或接受字符串的公共构造函数 另一种选择实现。您可以在此处查看示例。 如果您不拥有该类(它是无法更改的第三方

  • 如何通过带有自定义字段的wp rest api v2正确创建自定义post类型记录?无法创建自定义字段或更新它们。 我在一个自托管的wordpress安装中安装了超级列表和超级列表子主题。 此主题使用自定义分类法来定义类别、位置、称为业务的自定义帖子类型以及自定义帖子类型的帖子元中的自定义字段 我正在尝试使用rest api v2将数据导入站点,并成功创建了自定义类别和位置。我使用REST API

  • 我试图使用OpenNLPJavaAPI从文档中提取名称、技能等实体。但它没有提取正确的名称。我使用opennlp源锻造链接上可用的模型 下面是一段java代码- 我想做的是: 我正在使用ApacheTika将PDF文档转换为纯文本文档 但它正在提取姓名和其他单词。它不是提取专有名称。如何创建自定义模型,从文档中提取游泳、编程等技能? 给我一些想法! 任何帮助都将不胜感激!?

  • 问题内容: 我有一个类,可以根据消息的类将传入的消息映射到匹配的读者。所有消息类型都实现接口消息。读者在mapper类中注册,说明它将能够处理的消息类型。这些信息需要以某种方式存储在消息阅读器中,而我的方法是从构造函数中设置一个数组。 现在,似乎我对泛型和/或数组有些误解,似乎无法弄清楚,请参见下面的代码。它是什么? ETA : 正如cletus正确指出的那样,最基本的谷歌搜索表明Java不允许通