使用与朋友fb app运行的图片属性格式

时间:2012-08-04 17:02:49

标签: python facebook facebook-apps

我正在编辑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

2 个答案:

答案 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']