使用 ndb.blobproperty 引发的值错误

value error raised from using ndb.blobproperty

所以我正在学习 Python App Engine 的图像教程,但我收到了错误:"raise ValueError('Name %r cannot contain period characters' % (name,))"

我正在尝试将图像保存为模型的一部分。我认为这与我保存上传图像的方式有关。我在模型 class 中使用了 ndb.BlobProperty()。这是代码。

class Greeting(ndb.Model):
"""A main model for representing an individual Guestbook entry."""
author = ndb.StructuredProperty(Author)
content = ndb.StringProperty(indexed=False)
avatar = ndb.BlobProperty()
date = ndb.DateTimeProperty(auto_now_add=True)

然后我尝试通过制作模型并使用.put()添加来将模型放入数据库。我不确定语法是否适合设置属性。这是我在 post(self) 方法中的处理程序 class 中的内容。

greeting = Greeting(parent=guestbook_key(guestbook_name))
greeting.content = self.request.get('content')
avatar = images.resize(self.request.get('img'), 32, 32)
greeting.avatar = ndb.BlobProperty(avatar)
greeting.put()

抱歉,这是堆栈跟踪

在我看来,您没有正确检索图像数据,而不是:

avatar = images.resize(self.request.get('img'), 32, 32)

试试这个:

avatar = images.resize(self.request.POST['img'].value, 32, 32)

这是because:

Uploaded files are available as cgi.FieldStorage (see the cgi module) instances directly in request.POST.

所以这样,你也可以得到这样的文件名:

self.request.POST['img'].filename 

更新:

正如 @Greg 提到的,使用 BlobProperty 是你的直接问题,所以你需要改变这一切:

avatar = images.resize(self.request.get('img'), 32, 32)
greeting.avatar = ndb.BlobProperty(avatar)

为此:

greeting.avatar = images.resize(self.request.POST['img'].value, 32, 32)

您不应该使用 BlobProperty 在您的模型上设置值 - 您应该只将值设置为字符串:而不是

greeting.avatar = ndb.BlobProperty(avatar)

尝试:

greeting.avatar = avatar