Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python AppEngine->&引用;属性错误:';unicode';对象没有属性';有U键'&引用;使用blobstore时_Python_Google App Engine_Blobstore - Fatal编程技术网

Python AppEngine->&引用;属性错误:';unicode';对象没有属性';有U键'&引用;使用blobstore时

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

这里还有很多关于AttributeErrors的问题,但我已经通读了它们,仍然不确定在我的具体案例中是什么导致了类型不匹配

提前感谢您对此的任何想法

我的型号:

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。