我正在编辑Runwithfriends FB示例应用程序来构建我自己的应用程序。它工作正常,我在这里和那里做了一些改变。我休息了大约两个星期,但现在当我尝试访问应用程序时,我得到一个奇怪的python错误:
在init_facebook中的C:\ Program Files \ Apache Software Foundation \ Tomcat 7.0 \ webapps \ ROOT \ app \ main.py(self =< main .RecentRunsHandler对象>) 316 user_id = facebook.user_id,friends = friends, 317 access_token = facebook.access_token,name = me [u'name'], => 318 email = me.get(u'email'),picture = me [u'picture']) 319 user.put() 320除了KeyError,ex:
< ..部分剪辑..>
class'google.appengine.api.datastore_errors.BadValueError'>:属性图片必须是str或unicode实例,而不是dict args =('属性图片必须是str或unicode实例,而不是dict',) message ='属性图片必须是str或unicode实例,而不是dict'“
我知道这是一个非常通用的错误,但它指向以下代码。这段代码一直存在,我从未接触过它。我真的不知道现在还能看到什么 - 我已经搜索过详尽但无法找到线索。对不起,如果这仍然太宽泛,但我很高兴你能告诉我我可以提供哪些其他信息来调试: - (
def init_facebook(self):
"""Sets up the request specific Facebook and User instance"""
facebook = Facebook()
user = None
# initial facebook request comes in as a POST with a signed_request
if u'signed_request' in self.request.POST:
facebook.load_signed_request(self.request.get('signed_request'))
# we reset the method to GET because a request from facebook with a
# signed_request uses POST for security reasons, despite it
# actually being a GET. in webapp causes loss of request.POST data.
self.request.method = u'GET'
self.set_cookie(
'u', facebook.user_cookie, datetime.timedelta(minutes=1440))
elif 'u' in self.request.cookies:
facebook.load_signed_request(self.request.cookies.get('u'))
# try to load or create a user object
if facebook.user_id:
user = User.get_by_key_name(facebook.user_id)
if user:
# update stored access_token
if facebook.access_token and \
facebook.access_token != user.access_token:
user.access_token = facebook.access_token
user.put()
# refresh data if we failed in doing so after a realtime ping
if user.dirty:
user.refresh_data()
# restore stored access_token if necessary
if not facebook.access_token:
facebook.access_token = user.access_token
if not user and facebook.access_token:
me = facebook.api(u'/me', {u'fields': _USER_FIELDS})
try:
friends = [user[u'id'] for user in me[u'friends'][u'data']]
user = User(key_name=facebook.user_id,
user_id=facebook.user_id, friends=friends,
access_token=facebook.access_token, name=me[u'name'],
email=me.get(u'email'), picture=me[u'picture'])
user.put()
except KeyError, ex:
pass # ignore if can't get the minimum fields
self.facebook = facebook
self.user = user
答案 0 :(得分:1)
可能与October 2012 Breaking Changes,引用:
有关/ picture connection将在指定回调时返回字典
当访问对象的/ picture连接并指定回调属性时,我们将开始返回包含字段url,height,width和is_silhouette的字典。目前我们只是将图片网址作为字符串返回。
因此,在目前使用picture=me[u'picture']
的代码中,请尝试访问url
字典的picture
属性。 (如果它有一个;我无法确定这是否适用,因为我不知道您的代码是否会被视为指定了回调属性。)
如果我的假设是正确的,您还可以按照路线图中的说明启用迁移;但这只会使你的应用程序以旧的方式工作到10月3日,所以最好立即尝试修复它。
答案 1 :(得分:0)
这是获取图片的方法:
picture=me[u'picture'][u'data'][u'url']