可以在Google App Engine上使用Python Requests库吗?

时间:2012-03-07 15:56:30

标签: python google-app-engine python-requests

我可以在Google App Engine上使用Requests吗?我认为这个库非常适合创建REST客户端。

7 个答案:

答案 0 :(得分:38)

安装requests-toolbelt库: https://github.com/sigmavirus24/requests-toolbelt

对于App Engine,它可能类似于:pip install requests-toolbelt -t lib

(参见:https://cloud.google.com/appengine/docs/python/tools/using-libraries-python-27#installing_a_library

然后添加:

from requests_toolbelt.adapters import appengine
appengine.monkeypatch()

main.py或同等内容中

修改:此解决方案现已成为官方文档的一部分:https://cloud.google.com/appengine/docs/python/issue-requests#issuing_an_http_request (在REQUESTS标签中)

答案 1 :(得分:26)

是。在Google Appengine(版本1.9.18)requests 版本2.3.0 适用于生产(但不适用于SDK),如果您启用了计费,则可启用套接字支持。

更新:截至2017年1月31日,Requests正在制作中,版本为2.9.1。但是,它无法使用Google云端SDK 141.0.0

Appengine SDK上的

请求因所有https:// requests:

而失败
  ConnectionError: ('Connection aborted.', error(13, 'Permission denied'))

请求版本2.4.1在生产中失败:

  File "distlib/requests/adapters.py", line 407, in send
    raise ConnectionError(err, request=request)
  ConnectionError: ('Connection aborted.', error(13, 'Permission denied'))

请求版本2.5.1在生产中失败:

  File "distlib/requests/adapters.py", line 415, in send
    raise ConnectionError(err, request=request)
  ConnectionError: ('Connection aborted.', error(13, 'Permission denied'))

请求版本2.3.0在生产中工作,但可能会导致Debian中的问题被删除SDK中的SSLv3支持(请求2.3.0附带自己现在过时的urllib3)。作为解决方法,可以在请求的urllib3副本中删除包含PROTOCOL_SSLv3的行。

  'module' object has no attribute 'PROTOCOL_SSLv3'

有关套接字支持的信息:https://cloud.google.com/appengine/docs/python/sockets/

答案 2 :(得分:8)

尚未,但希望很快。正在开展对GAE的支持 - 请参阅问题#498(App Engine修复)。

请求使用urllib3httplib使用is {GA}支持的urlfetch API作为optional的包装。虽然urllib3使用GAE上没有的一些模块,但故意使用{{3}}这样的用法,以便urllib3可用于GAE。

答案 3 :(得分:8)

现在可以了,我在appengine_config.py中使用这种变通办法的组合工作:

# Step 1: first add requests and requests-toolbelt to your requirements.txt (or however you install them via pip)
# Step 2: in appengine_config.py add the following snippet:

# see https://cloud.google.com/appengine/docs/python/issue-requests#issuing_an_http_request
import requests
import requests_toolbelt.adapters.appengine

# Use the App Engine Requests adapter. This makes sure that Requests uses
# URLFetch.
requests_toolbelt.adapters.appengine.monkeypatch()

# also monkey patch platform.platform() from https://code.google.com/p/googleappengine/issues/detail?id=12982
import platform

def patch(module):
    def decorate(func):
        setattr(module, func.func_name, func)
        return func
    return decorate


@patch(platform)
def platform():
    return 'AppEngine'

答案 4 :(得分:3)

不,在more recent post中,开发人员说他们不支持GAE,因为它与python太不一样了。

答案 5 :(得分:0)

是的,您可以使用请求模块。 GCP不支持开箱即用地使用请求库。因此,我们必须花一些时间才能使它生效。 为了在Google App Engine上部署应用程序,我们需要制作main.py(主python flask应用程序所在的位置)和app.yaml(在GCP中运行它所需的配置文件)。 这是适用于python 2.7环境的app.yaml文件的示例代码

runtime: python27
api_version: 1
threadsafe: true

handlers:
- url: /.*
  redirect_http_response_code: 301
  script: main.app

libraries:
- name: flask
  version: 0.12

现在,我们需要配置请求库以在内部使用URLfetch。 要使用请求,我们需要使用供应商说明安装请求和request-toolbelt。 (https://cloud.google.com/appengine/docs/standard/python/tools/using-libraries-python-27#installing_a_library)。 基本上,我们需要安装自定义库。

  1. 创建一个目录来存储您的第三方库,例如lib / mkdir lib
  2. 从您的系统上下载requests和requests-toolbelt库,或将它们直接下载到先前步骤中创建的lib文件夹中。
  3. 使用带有-t标志的pip(版本6或更高版本)将库复制到上一步中创建的文件夹中。例如: pip install -t lib /(pip install -t lib /请求)
  4. 在与app.yaml文件相同的文件夹中创建一个名为appengine_config.py的文件。
  5. 编辑appengine_config.py文件,并将您的库目录提供给vendor.add()方法。 示例appengine_config.py文件

    from google.appengine.ext import vendor
    # Add any libraries install in the "lib" folder.
    vendor.add('lib/requests')
    vendor.add('lib/requests_toolbelt')
    
  6. 一旦安装,请使用request_toolbelt.adapters.appengine模块配置请求以使用URLFetch。 将以下代码复制到main.py文件的开头

    import requests
    from requests_toolbelt.adapters import appengine
    appengine.monkeypatch(validate_certificate=True)
    

https://cloud.google.com/appengine/docs/standard/python/issue-requests

现在,我们可以轻松地使用请求库发出获取/发布请求。 测试您的应用程序:

dev_appserver.py --port=<port number> app.yaml

答案 6 :(得分:0)

为了修正与Google App Engine一起使用的请求,同时又允许我的应用程序在GAE之外运行,我添加了以下代码:

try:
    from google.appengine.api import urlfetch
    from requests_toolbelt.adapters import appengine
    appengine.monkeypatch()
except ImportError:
    pass