【问题标题】:pyfacebook + Google App Engine: can't find new functions in facebook.pypyfacebook + Google App Engine:在 facebook.py 中找不到新功能
【发布时间】:2026-02-12 17:25:01
【问题描述】:

我正在尝试在 Google 应用引擎项目中使用 pyfacebook 功能 (https://github.com/sciyoshi/pyfacebook/)。我遵循了 Facebook 开发者论坛 (http://forum.developers.facebook.net/viewtopic.php?pid=164613) 上的建议,并将附加功能添加到 __init__.py 文件中,将该文件复制到根目录我的项目目录并将其重命名为 facebook.py。导入 facebook.py 后,我在页面的 Python 类的 get(self) 方法中添加了以下内容:

facebookapi = facebook.Facebook(API_KEY, SECRET)

    if not facebookapi.check_connect_session(self.request):
        path = os.path.join(os.path.dirname(__file__), 'templates/login.html')
        self.response.out.write(template.render(path, {'apikey': API_KEY}))
        return

    user = facebookapi.users.getInfo(
        [facebookapi.uid],
        ['uid', 'name', 'birthday', 'relationship_status'])[0]

    template_values = {
        'name': user['name'],
        'birthday': user['birthday'],
        'relationship_status': user['relationship_status'],
        'uid': user['uid'],
        'apikey': API_KEY
    }

    path = os.path.join(os.path.dirname(__file__), 'templates/index.html')
    self.response.out.write(template.render(path, template_values))

运行时出现以下错误:

文件“\much\baw08u\Private\IDS\helloworld\helloworld.py”,第 54 行,在获取中

如果不是 facebookapi.check_connect_session(self.request): AttributeError:“Facebook”对象没有属性“check_connect_session”

所以它似乎可以很好地加载 facebook API,但不是我添加的新方法。我从开发者论坛复制并粘贴了 Facebook 类定义底部的代码,并确保所有缩进都是正确的,但它似乎仍然无法识别它们。有谁知道可能是什么问题?

谢谢

【问题讨论】:

  • 您是否向 facebook.Facebook 添加了方法(应该可以工作)或向 facebook 添加了函数(不应该工作,除非您使用 facebook.function_name)?
  • 是的,这一切都在 facebook.Facebook 中——检查了缩进和所有内容。有没有人有修改后的 _init_.py 的副本,我可以测试它是否与语法有关?
  • 有编译版吗?删除它。
  • 不,删除所有 .pyc 文件,重新启动启动器,同样的事情仍然发生!我已经在 2 台不同的计算机上尝试过,结果相同。我找到了指向该文件的预修改版本的链接,但它们都是死链接。

标签: python google-app-engine facebook pyfacebook


【解决方案1】:

您认为Facebook 类有特定的方法,但Python 确信它没有。为什么?也许您拼错了方法名称,也许您没有正确缩进 - 没有看到代码很难说。

您可以尝试四处寻找来验证您的假设:

import facebook
import logging

logging.warn('Facebook class: %r', dir(facebook.Facebook))
logging.warn('facebook module: %r', dir(facebook))

如果您确定您在正确的文件上进行操作,您应该期望将 check_connect_session 视为 Facebook 的一种方法。如果您没有添加足够的缩进,那么您希望看到 check_connect_method 作为 facebook 模块中定义的函数。太多的缩进会使 check_connect_method 成为它之前的任何方法的子函数,并且它不会出现在上面的日志中。密切注意缩进。

但是,添加一些自定义方法的更好方法可能是:

import facebook

class Facebook(facebook.Facebook):
    def check_connect_session(request):
        pass

facebookapi = Facebook(API_KEY, SECRET)

if not facebookapi.check_connect_session(...):
    ...

现在,当 Facebook 更新他们的代码时,您只需将新文件复制到位 - 无需合并您的自定义。

【讨论】:

  • 我尝试了警告,它说我的方法仍然不存在。我试过把它放在课堂上的不同地方,但它仍然不起作用。这是我修改后的 facebook.py 的链接:这些方法是从 1944 行开始定义的。我感觉我正盯着错误但看不到它...pastebin.com/wTVYBumB
  • 缩进太多 :-) 你创建了一个嵌套函数,而不是一个方法。