Python AppEngine->&引用;属性错误:';unicode';对象没有属性';有U键'&引用;使用blobstore时
这里还有很多关于AttributeErrors的问题,但我已经通读了它们,仍然不确定在我的具体案例中是什么导致了类型不匹配 提前感谢您对此的任何想法 我的型号:Python AppEngine->&引用;属性错误:';unicode';对象没有属性';有U键'&引用;使用blobstore时,python,google-app-engine,blobstore,Python,Google App Engine,Blobstore,这里还有很多关于AttributeErrors的问题,但我已经通读了它们,仍然不确定在我的具体案例中是什么导致了类型不匹配 提前感谢您对此的任何想法 我的型号: class Object(db.Model): notes = db.StringProperty(multiline=False) other_item = db.ReferenceProperty(Other) time = db.DateTimeProperty(auto_now_add=True) new_fil
class Object(db.Model):
notes = db.StringProperty(multiline=False)
other_item = db.ReferenceProperty(Other)
time = db.DateTimeProperty(auto_now_add=True)
new_files = blobstore.BlobReferenceProperty(required=True)
email = db.EmailProperty()
is_purple = db.BooleanProperty()
class FormUploadHandler(blobstore_handlers.BlobstoreUploadHandler):
def post(self):
try:
note = self.request.get('notes')
email_addr = self.request.get('email')
o = self.request.get('other')
upload_file = self.get_uploads()[0]
# Save the object record
new_object = Object(notes=note,
other=o,
email=email_addr,
is_purple=False,
new_files=upload_file.key())
db.put(new_object)
# Redirect to let user know everything's peachy.
self.redirect('/upload_success.html')
except:
self.redirect('/upload_failure.html')
我的BlobstoreUploadHandler:
class Object(db.Model):
notes = db.StringProperty(multiline=False)
other_item = db.ReferenceProperty(Other)
time = db.DateTimeProperty(auto_now_add=True)
new_files = blobstore.BlobReferenceProperty(required=True)
email = db.EmailProperty()
is_purple = db.BooleanProperty()
class FormUploadHandler(blobstore_handlers.BlobstoreUploadHandler):
def post(self):
try:
note = self.request.get('notes')
email_addr = self.request.get('email')
o = self.request.get('other')
upload_file = self.get_uploads()[0]
# Save the object record
new_object = Object(notes=note,
other=o,
email=email_addr,
is_purple=False,
new_files=upload_file.key())
db.put(new_object)
# Redirect to let user know everything's peachy.
self.redirect('/upload_success.html')
except:
self.redirect('/upload_failure.html')
每次我提交上传文件的表单时,它都会抛出以下异常:
ERROR 2010-10-30 21:31:01,045 __init__.py:391] 'unicode' object has no attribute 'has_key'
Traceback (most recent call last):
File "/home/user/Public/dir/google_appengine/google/appengine/ext/webapp/__init__.py", line 513, in __call__
handler.post(*groups)
File "/home/user/Public/dir/myapp/myapp.py", line 187, in post
new_files=upload_file.key())
File "/home/user/Public/dir/google_appengine/google/appengine/ext/db/__init__.py", line 813, in __init__
prop.__set__(self, value)
File "/home/user/Public/dir/google_appengine/google/appengine/ext/db/__init__.py", line 3216, in __set__
value = self.validate(value)
File "/home/user/Public/dir/google_appengine/google/appengine/ext/db/__init__.py", line 3246, in validate
if value is not None and not value.has_key():
AttributeError: 'unicode' object has no attribute 'has_key'
最让我困惑的是,这段代码几乎是直接从文档中提取出来的,并且与我在在线教程中找到的blob upload handler的其他示例进行了对比
我已经运行了--clear datastore,以确保我对DB模式所做的任何更改都不会引起问题,并尝试将upload_file
转换为各种各样的东西,以查看它是否能安抚Python—对我搞砸的事情有什么想法吗
编辑:我找到了一个解决办法,但它不是最理想的 将UploadHandler改为此可解决以下问题:
...
# Save the object record
new_object = Object()
new_object.notes = note
new_object.other = o
new_object.email = email.addr
new_object.is_purple = False
new_object.new_files = upload_file.key()
db.put(new_object)
...
我在注意到注释掉files行会给其他
行带来同样的问题后做出了这个切换,依此类推。不过,这不是一个最佳的解决方案,因为我不能以这种方式强制执行验证(在模型中,如果我根据需要设置了任何内容,我就不能像上面那样声明一个空实体而不引发异常)
关于为什么我不能同时声明实体和填充它,有什么想法吗?[注意:我对“谷歌应用程序引擎”一窍不通]
该消息表示它需要一个
dict
(唯一已知的具有的对象具有_key
属性)或类似于工作的对象,而不是您提供的unicode
对象。也许你应该传递upload\u file
,而不是upload\u file.key()
。[注意:我知道很多关于“谷歌应用程序引擎”的信息]
该消息表示它需要一个
dict
(唯一已知的具有的对象具有_key
属性)或类似于工作的对象,而不是您提供的unicode
对象。可能您应该传递的是upload\u file
,而不是upload\u file.key()
。具有\u密钥错误是由于其他\u项的引用属性造成的。当appengine的api需要dict时,您很可能正在为其他_项传入“”。为了避免这种情况,您需要将其他_项转换为哈希 has_键错误是由于ReferenceProperty和其他_项引起的。当appengine的api需要dict时,您很可能正在为其他_项传入“”。为了避免这种情况,您需要将其他_项转换为哈希 您正在将o
作为other\u项的值
(在示例代码中,您称之为other
,但我认为这是一个输入错误)<但是,code>o是从请求中获取的字符串,模型定义指定它是ReferenceProperty
,因此它应该是Other
类的实例,或者是db.Key
对象
如果o
应该是一个字符串化的键,则传入db.key(o)
来反序列化它
Object
对于数据存储类(或者任何类)来说都是一个非常糟糕的名称,顺便说一句,Python的基本对象被称为Object
,而且只有一个大写字母,很容易出错。您将o
作为其他项的值传递(在示例代码中,您称之为other
,但我认为这是一个输入错误)。o
是从请求中获取的字符串,模型定义指定它是引用属性,因此它应该是other
类的实例,或者是db.Key
对象
如果o
应该是一个字符串化的键,则传入db.key(o)
来反序列化它
Object
对于数据存储类(或者任何类,真的)来说都是一个非常糟糕的名称,顺便说一句-Python基本对象名为object
,而且只有一个大写字母-很容易出错。感谢您的快速响应,John。我尝试了“upload_file”,但它也不起作用。此外,这似乎是文档中列出的方式:实际上,db.Model
定义了有_-key
方法。这是一个不幸的,但现在不可逆的命名巧合。感谢您的快速响应,John。我尝试了“上传_-file”,但也不起作用。此外,文档中似乎是这样规定的:实际上,db.Model
定义了一个有_-key
方法。一个不幸的,但没有不可逆的,命名的巧合。API不希望这里有dict。API不希望这里有dict。