1

我正在尝试遵循教程:将 Facebook/Twitter/Google 身份验证添加到 Django 应用程序。我唯一不同的是我在 Google App Engine 开发服务器上运行 DjangoAppEngine,否则一切都完全按照教程。

当我进入第 4 步并实际尝试使用 Facebook 进行身份验证时,我收到了运行时错误:

error('illegal IP address string passed to inet_pton',)

Request Method: GET
Request URL:    http://localtest.com:8080/o/complete/facebook/?redirect_state=FG4K...UG1k
Django Version: 1.6.11
Exception Type: RuntimeError
Exception Location: /Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/remote_api/remote_api_stub.py in _MakeRealSyncCall, line 235
Python Executable:  /usr/local/opt/python/bin/python2.7
Python Version: 2.7.11

显然 FB 正在将批准传回给我的应用程序,因为请求 URL 包含回调路径。

似乎 GoogleAppEngineLauncher 中的某些内容正在尝试查找地址并且没有接收到正确的数据?我不太确定。

在尝试解决此问题时,我在某处看到一条评论,向用户建议SimpleAuth可能是更好的方法,但我不明白为什么,我不确定是否要重新开始我只是错过了一些明显的东西。

有谁知道我为什么会收到这个错误以及我可以做些什么来纠正它?

4

3 回答 3

1

这是因为 Facebook SDK 依赖于很棒的requests库。但是,requests由于该平台有一些限制,因此不适用于 Google App Engine。您必须使用他们的urlfetchAPI 来获取 Google App Engine 上的外部内容。

所以是的,官方的 Facebook SDK 不起作用。您必须推出自己的解决方案或找到一个可行的解决方案。SimpleAuth是已知有效的解决方案之一。

于 2016-01-03T11:39:51.460 回答
1

更新:不再需要原始答案(以“HOWEVER”开头),只需使用requests2.10.0 或更高版本、urllib31.15.1 或更高版本和requests_toolbelt0.6.2 或更高版本并在 main() 中执行以下操作:

from requests_toolbelt.adapters import appengine
appengine.monkeypatch()

但是,如果您使用的是旧版本的请求和/或 urllib3,那么您需要以下补丁:

这可以使用与软件包requests一起的补丁版本来完成。requests-toolbelt适用的主题:

我已经应用了所有这些,现在已经在本地测试(开发服务器)和生产(完整的 App Engine)中工作python-social-authfacebook-sdk

于 2016-01-31T01:34:53.677 回答
0

在您的供应商库中,确保您有 requests_toolbelt。( pip install -t lib requests_toolbelt)。然后在 python-social-auth 调用请求之前提供“monkeypatch”应用引擎支持。在我的 project/wsgi.py 中,我添加了以下几行:

from requests_toolbelt.adapters import appengine
appengine.monkeypatch()

python-social-auth 依赖于requests,因此它也应该存在于您的供应商目录中。

您还必须确保您使用的请求版本 >= 2.10.0。这还没有发布,所以你可以伪造它。编辑lib/requests/__init__.py以便__build__ = 0x021000. urllib3您还必须将目录中的打包版本升级lib/requests/packages/到最新版本。

这对我有用。

于 2016-03-11T15:28:55.390 回答