0

我遇到了在我的机器上测试应用程序时不会发生的错误,但只有在部署之后才会发生。

我有一些与数据存储区中的父项关联的图片,并且我设置了一个查询来删除父项和相关图片:数据存储区和 blobstore 值

我有一个基本密钥,用作所有项目的祖先:

def base_key(group = 'default'):
    return db.Key.from_path('my_items', group)

我得到了父项目和他的附件

parent = Parent.by_keyname(s)
attachments = Attachment.by_parent_keyname(s)

这是这些查询的实现:

@classmethod # in Parent class
    def by_keyname(cls, s):
        item_k = db.Key.from_path('Parent', s, parent=base_key())
        item= db.get(item_k)
        return item

@classmethod # in Attachment class
    def by_parent_keyname(cls, s):
        item_k= db.Key.from_path('Parent', s, parent=base_key())
        q = Attachment.all()
        q.ancestor(item_k)
        results = q.fetch(20)
        return results

在获得父项和附件后,我实例化了一个列表,其中包含我必须从数据存储和 blobstore 中删除其元素的所有键:

entities_to_delete = [parent.key()]
            for a in attachments:
                entities_to_delete.append(a.key())
                entities_to_delete.append(
                    db.Key.from_path('__BlobInfo__', str(a.blob.key())))

            db.delete(entities_to_delete)

这在我的机器上完美运行,但部署后,如果我测试这个请求处理程序,我会收到服务器错误,这是我记录的错误:

应用引擎日志

全尺寸图像

4

1 回答 1

1

似乎开发服务器和实时服务器对删除 BlobInfo 实体的含义有不同的想法。最直接的解决方法是调用delete()Blob 键的 Blobstore 方法:

entities_to_delete = []
blobs_to_delete = []
for a in attachments:
    entities_to_delete.append(upload.key())
    blobs_to_delete.append(upload.blob.key())
db.delete(entities_to_delete)
blobstore.delete(blobs_to_delete)

可能仍然有一种方法可以以db.delete()可接受的方式构造 BlobInfo 键,但是您从我的代码示例中借用的代码确实不准确。对于给您带来的不便,我深表歉意,并感谢您向我提问!

于 2013-05-08T15:34:39.670 回答