在Google App Engine本地开发服务器中使用请求

问题描述 投票:1回答:1

我有一个用于我的Web服务的SDK,它通过PyPI作为Python库分发。我的库使用requests使用典型的类似REST的请求与后端进行通信。

我希望我的库与Google App Engine(GAE)上托管的应用程序兼容。据the GAE documentation on HTTP requests说:

要使用请求,您需要使用vendoring说明安装请求和requests-toolbelt。

安装后,使用requests_toolbelt.adapters.appengine模块配置使用URLFetch的请求:

所以我按照那里给出的例子,在我的图书馆的主要模块中有这个:

  if os.getenv('SERVER_SOFTWARE', '').startswith('Google App Engine/'):
        import requests_toolbelt.adapters.appengine
        requests_toolbelt.adapters.appengine.monkeypatch()

当使用我的库的客户端应用程序实际上在App Engine实例上运行时,这似乎可以解决问题。

但是,当使用development web server (dev_appserver.py)在本地运行客户端应用程序时,os.getenv('SERVER_SOFTWARE')会返回"Development/2.0",因此不会执行monkeypatch。我在尝试发出请求时遇到了这些错误:

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

如何检测我的库的主机应用程序是在Google App Engine本身运行还是在开发Web服务器内运行?检查“开发/ 2.0”似乎不会有足够的区别。

或者,在运送需要支持“典型”网络请求的共享Python库时,是否有更好的通用模式?

python google-app-engine python-requests
1个回答
2
投票

通过Google Cloud SDK,似乎Google自己确定我们是否在生产或开发(dev_appserver.py)Google App Engine环境中运行的方法确实是为SERVER_SOFTWARE寻找这些值中的任何一个。来自apitools/base/py/util.py

def DetectGae():
    """Determine whether or not we're running on GAE.

    This is based on:
      https://developers.google.com/appengine/docs/python/#The_Environment

    Returns:
      True iff we're running on GAE.
    """
    server_software = os.environ.get('SERVER_SOFTWARE', '')
    return (server_software.startswith('Development/') or
            server_software.startswith('Google App Engine/'))
© www.soinside.com 2019 - 2024. All rights reserved.