0

我到处搜索,但以前没有人说过这个错误。

obj 将返回一个 unicode 对象,但它会返回以下错误

Exception Type: AttributeError  
Exception Value:'unicode' object has no attribute 'pk'

如果我对响应的结果进行硬编码,它就会起作用。
客户帐户.py

from django.contrib.auth.models import User  

检查登录

 return user

api.py

result = CustomerAccount.login(username, password)  
return HttpResponse(json.dumps(result), content_type="application/json")

视图.py

import urllib2  
import json

res = urllib2.urlopen("http://127.0.0.1:8000/api/login?username=admin&password=admin").read()  
obj = json.loads(res)
print obj[0].pk

打印 obj 的结果:

[{“pk”:1,“model”:“auth.user”,“fields”:{“username”:“admin”,“first_name”:“Admin”,“last_name”:“admin”,“is_active” :真,“is_superuser”:真,“is_staff”:真,“last_login”:“2013-05-29T08:08:43.859Z”,“组”:[],“user_permissions”:[],“密码”: "pbkdf2_sha256$10000$1HdCOPgsoXvx$8jjOpTFVcVAtUshpjJDPEGs/TRq7jeJ2T/2i55FIPeM=", "email": "admin@admin.com", "date_joined": "2013-05-15T07:59:30Z"}}]

4

2 回答 2

3

你的类型错误:

  • obj是一个list
  • obj[0]是一个dict
  • adict没有pk属性,但是您可以使用以下命令检索键的值"pk"obj[0]['pk']
于 2013-06-05T06:50:05.030 回答
2

你说你得到

Exception Value:'unicode' object has no attribute 'pk'

检索时obj[0].pk。如果这是一个数据类型错误,你会得到'dict' object has no attribute 'pk'

所以问题是你obj[0]的不是dict你期望的 a 或 a list,而是一个unicode string

根据评论,这就是发生的事情:

  1. 您生成 JSON 对象服务器端。
  2. JSON 编码它。你现在有一个unicode 字符串
  3. 再次对其进行 JSON 编码。现在你有一个 unicode 字符串作为 JSON 对象。

  4. 从 URL 中检索它。

  5. 解码一次。您现在拥有对对象进行编码的unicode 字符串。
  6. 从 unicode 字符串中提取pk......你不能这样做。

一个快速的解决方法是对对象进行两次解码。真正的解决方法是检测双重编码发生的位置并防止这种情况发生。

应该告诉我发生了什么的事情是这样的:

[{"pk": 1, "model": ...

如果那是一个Python对象(而不是 JSON 编码),它会是:

[{u'pk': 1, u'model': ...
于 2013-06-05T07:02:59.793 回答