【问题标题】:Can Python Requests library be used on Google App Engine?可以在 Google App Engine 上使用 Python Requests 库吗?
【发布时间】:2012-03-25 04:14:43
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    还没有,但希望很快。正在努力支持 GAE - 请参阅问题 #498(App Engine 修复)。

    Requests 使用urllib3,而后者又使用httplib,GAE 支持is 作为urlfetch API 的包装器。虽然 urllib3 使用了一些 GAE 上不可用的模块,但这种用法是特意制作的 optional,以便 urllib3 可以在 GAE 上使用。

    【讨论】:

    • 你知道这是否已经改变了吗?
    • 我没有,但你可以从答案中提问。
    • 你是如何让它工作的?即使迟到了,知道怎么做也可能是件好事
    【解决方案2】:

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

    【讨论】:

    • 他们不支持它,但您仍然可以使用该库。只需下载源代码并直接导入即可。如果您需要使用套接字来绕过urlfetch() 限制,请使用sockets
    • 您是否启用了套接字?
    • 抱歉,@Ann,我忘记了请求源需要进行一些调整才能使其与 App Engine 很好地配合使用。我想试试this。如果您遇到问题并想使用 Requests,我可以发布我使用的有效资源...让我知道。
    【解决方案3】:

    是的。在 Google Appengine(版本 1.9.18)requests版本 2.3.0 上工作在生产中(但不是在 SDK 上)如果您启用了计费,这启用了套接字支持。

    更新:截至 2017 年 1 月 31 日,Requests 正在生产中,版本 2.9.1 正在生产中。但是,它不适用于 Google Cloud SDK 141.0.0

    Appengine SDK 上的请求因所有 https:// 请求而失败:

      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'))
    

    requests 版本 2.3.0 可以在生产中使用,但可能会导致 Debians 在 SDK 中删除 SSLv3 支持(requests 2.3.0 带有自己的现已过时的 urllib3)。作为解决方法,可以删除请求的 urllib3 副本源中包含 PROTOCOL_SSLv3 的行。

      'module' object has no attribute 'PROTOCOL_SSLv3'
    

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

    【讨论】:

    • 您可以通过加载 SSL 库 stackoverflow.com/a/34135758/172322 来修复 https:// 请求
    • 即使我没有启用计费功能,对 https 网站的请求仍然有效 - 这是为什么呢?
    • 我刚刚发现只要socket库没有被实际使用(被request库使用),如果没有启用计费(即未使用的导入和未使用的),App Engine就不会抛出异常代码很好)。这是因为我只发出了简单的 GET 请求。当我检查使用的配额时,底层代码中实际调用的是 App Engine 的 URL 获取库(在我的用例中,使用 urllib2 而不是请求可能是更好的选择)。此外,它在不包括我的情况下的 SSL 库的情况下工作; App Engine 的 URL 获取支持 https
    • 加载 ssl 库可作为实时服务器上的修复,但似乎不适用于开发服务器
    • 将请求更改为 2.3.0 版并在 app.yml 中包含 ssl 库为我解决了这个问题!谢谢
    【解决方案4】:

    安装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 标签中)

    【讨论】:

    • 仅供参考,在导入任何使用请求的模块之前,appengine.monkeypatch() 行应该在你的导入中。
    • 这应该是公认的答案,它对我有用
    • 虽然这适用于大多数情况,但应注意此方法使用 App Engine 的 urlfetch,它在免费配额下可用,但有一些限制。例如,它目前不支持客户端证书,它适用于使用套接字的approach in the currently accepted answer
    【解决方案5】:

    这现在是可能的,我在 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'
    

    【讨论】:

    • 谢谢,除了def platform()不需要缩进
    • 这应该是公认的答案,因为目前谷歌确实将其写入他们的文档中。 requests_toolbelt 猴子补丁有效。
    【解决方案6】:

    是的,您可以使用请求模块。 GCP 不支持开箱即用的 Requests 库。因此,我们将不得不花费一些时间来使其发挥作用。 为了在 Google App Engine 上部署应用程序,我们需要创建一个 main.py(主要 python 烧瓶应用程序所在的位置)和 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。 要使用 requests,我们需要使用 vendoring 说明安装 requests 和 requests-toolbelt。 (https://cloud.google.com/appengine/docs/standard/python/tools/using-libraries-python-27#installing_a_library)。 基本上我们需要安装我们的自定义库。

    1. 创建一个目录来存储您的第三方库,例如 lib/ mkdir 库
    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. 安装后,使用 requests_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)

    现在我们可以轻松地使用 requests 库来发出 get/post 请求。 测试您的应用:

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

    【讨论】:

      【解决方案7】:

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

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

      【讨论】:

        猜你喜欢
        • 2012-04-03
        • 1970-01-01
        • 2012-10-25
        • 1970-01-01
        • 1970-01-01
        • 2015-02-15
        • 2010-12-26
        • 1970-01-01
        • 2019-08-07
        相关资源
        最近更新 更多