使用ndb.blobproperty引发的值错误

时间:2015-02-20 03:52:28

标签: python django google-app-engine google-cloud-datastore app-engine-ndb

所以我正在关注Google App Engine的Python图像教程,并且我收到错误:"引发ValueError('名称%r不能包含句点字符'% (名称))"

我试图将图片保存为模型的一部分。我认为这与我如何保存上传的图像有关。我在我的Model类中使用了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)方法中处理器类中的内容。

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()

对不起,这是堆栈跟踪 enter image description here

2 个答案:

答案 0 :(得分:3)

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

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

试试这个:

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

这是because

  

上传的文件直接在request.POST中以cgi.FieldStorage(请参阅cgi模块)实例的形式提供。

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

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)

答案 1 :(得分:1)

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

greeting.avatar = ndb.BlobProperty(avatar)

尝试:

greeting.avatar = avatar