2

我正在为一个网站开发一个 python GAE 应用程序,我正在尝试进行联合登录。

根据Identity Platform 选择指南,网站的最佳解决方案似乎是Google Identity Toolkit (web)。浏览了我能找到的所有相关文档,然后转到教程,我遇到了一个问题——安装包失败,出现与cffiidentity-toolkit-python-client库相关的 C 编译错误,类似于这个:

# python -m pip install identity-toolkit-python-client
...
gcc -pthread -fno-strict-aliasing -fmessage-length=0 -grecord-gcc-switches -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables -g -DNDEBUG -fmessage-length=0 -grecord-gcc-switches -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector -funwind-tables -fasynchronous-unwind-tables -g -DOPENSSL_LOAD_CONF -fPIC -I/usr/include/python2.7 -c src/cryptography/hazmat/bindings/__pycache__/_Cryptography_cffi_a269d620xd5c405b7.c -o build/temp.linux-x86_64-2.7/src/cryptography/hazmat/bindings/__pycache__/_Cryptography_cffi_a269d620xd5c405b7.o

src/cryptography/hazmat/bindings/__pycache__/_Cryptography_cffi_a269d620xd5c405b7.c:2:20: fatal error: Python.h: No such file or directory

 #include <Python.h>

                    ^

compilation terminated.

error: command 'gcc' failed with exit status 1

在为我的 linux 发行版安装了一些特定的软件包之后,我设法最终正确地安装了该软件包,但是这些失败导致了我的实际问题(教程非常通用,我找不到任何关于 GAE 限制的提示)。

GAE python 沙箱文档中,只有纯 python代码应该存在于 GAE 应用程序中:

Python 运行环境的所有代码都必须是纯 Python,并且不包含任何 C 扩展或其他必须编译的代码。

我没有看到 GAE SDK 或其第 3 方库中包含的身份工具包,据我了解,这意味着我必须将其作为第 3 方库安装在我自己的应用程序中。但是纯 python代码限制也适用于这些库:

您可以将任何第三方库添加到您的应用程序中,只要它是在“纯 Python”(无 C 扩展)中实现的,并且在 App Engine 运行时环境中具有其他功能。

因此标题中的问题。

我错过了什么吗?

谢谢。

到目前为止,我正在使用 webapp2 和 jinja2。

4

3 回答 3

2

这不是 100%,支持的 3rd 方库,如 PyCrypto、numpy lxml 都具有基于“C”的扩展,但这些都由谷歌直接支持。你只是不能添加你自己的不在列表中。

请参阅第 3 方库文档https://cloud.google.com/appengine/docs/python/tools/libraries27

您必须区分 Google 支持的“第 3 方库”与您自己提供的第 3 方库。

你也没有说你使用的是什么框架。您可能会发现值得一看 authomatic http://peterhudec.github.io/authomatic/

开箱即用的支持:

  • OAuth 1.0a 提供商:Bitbucket、Flickr、Meetup、Plurk、Twitter、Tumblr、UbuntuOne、Vimeo、Xero、Xing 和 Yahoo。OAuth 2.0 提供商:Amazon、Behance、Bitly、Cosm、DeviantART、Eventbrite、Facebook、Foursquare、GitHub、Google、LinkedIn、PayPal、Reddit、Viadeo、VK、WindowsLive、Yammer 和 Yandex。基于 python-openid 和 Google App Engine 的 OpenID。
于 2015-06-27T05:44:16.720 回答
2

经过大量的挖掘,我终于把事情搞定了。

Tim Hofman 和 dsalama 的两个答案都适用,但真正引起重视的是这个答案:How to import lib folder within Modules这让我意识到,对于模块位于单独目录中的应用程序来说,第 3 方 libs 文档不太合适(典型的文档化应用程序结构https://cloud.google.com/appengine/docs/python/modules/#Python_Configuration

基本上,必须根据需要为使用 3rd 方库的每个模块应用 vendoring 方案:

  • lib目录(或库本身,取决于使用的供应商方案)必须在每个模块目录中可见/可访问
  • 每个模块必须有自己的appengine_config.py文件,并且供应商代码与模块文件并排可见,.yaml因为模块无权访问位于应用程序根目录中的文件(如果选择的供应商方案依赖于此类文件)
于 2015-07-09T15:59:34.677 回答
1

根据来自 Identity Toolkit 论坛的这个帖子,您可以通过包含 PyCrypto v2.6 或更高版本在 App Engine 沙箱中使用 Identity Toolkit。

为此,请将以下内容添加到您的 app.yaml 文件中:

libraries:
- name: pycrypto
  version: 2.6
于 2015-06-27T20:34:29.613 回答