24

我正在尝试在 Google App Engine 上使用很棒的 Requests 库。我找到了一个与 App Engine 兼容的 urllib3 补丁,它依赖于请求。https://github.com/shazow/urllib3/issues/61

我可以成功

import requests

但是之后

response = requests.get('someurl')

失败并出现以下回溯。这是怎么回事?

Traceback (most recent call last):
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/admin/__init__.py", line 317, in post
    exec(compiled_code, globals())
  File "<string>", line 6, in <module>
  File "/Users/Rohan/Dropbox/MuktiTechnologiesINC/MuktiTechnologies/GAE/humanmictweet/GAE/libraries/requests/api.py", line 52, in get
    return request('get', url, **kwargs)
  File "/Users/Rohan/Dropbox/MuktiTechnologiesINC/MuktiTechnologies/GAE/humanmictweet/GAE/libraries/requests/api.py", line 40, in request
    return s.request(method=method, url=url, **kwargs)
  File "/Users/Rohan/Dropbox/MuktiTechnologiesINC/MuktiTechnologies/GAE/humanmictweet/GAE/libraries/requests/sessions.py", line 208, in request
    r.send(prefetch=prefetch)
  File "/Users/Rohan/Dropbox/MuktiTechnologiesINC/MuktiTechnologies/GAE/humanmictweet/GAE/libraries/requests/models.py", line 458, in send
    self.auth = get_netrc_auth(url)
  File "/Users/Rohan/Dropbox/MuktiTechnologiesINC/MuktiTechnologies/GAE/humanmictweet/GAE/libraries/requests/utils.py", line 43, in get_netrc_auth
    for loc in locations:
  File "/Users/Rohan/Dropbox/MuktiTechnologiesINC/MuktiTechnologies/GAE/humanmictweet/GAE/libraries/requests/utils.py", line 40, in <genexpr>
    locations = (os.path.expanduser('~/{0}'.format(f)) for f in NETRC_FILES)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.py", line 260, in expanduser
    userhome = pwd.getpwuid(os.getuid()).pw_dir
AttributeError: 'module' object has no attribute 'getuid'
4

3 回答 3

14

如前所述,独立 urllib3 的主分支现在应该支持 AppEngine(一旦有人确认这一事实,我将发布适当的 PyPI 版本),但 Requests 尚不支持 AppEngine,因为它假设各种文件系统事物来加载配置文件t 存在于 AppEngine 上。具体来说,您遇到的错误与加载~/.netrc配置文件有关。

请参阅问题 #493

对于它的价值, urllib3 中的等价物是:

import urllib3
http = urllib3.PoolManager()
response = http.request('GET', 'someurl')

更新:昨天发布了 urllib3 v1.3,其中包括 AppEngine 支持。

于 2012-03-18T23:20:11.227 回答
10

您可以借助requests-toolbelt在 Google App Engine 上使用最新版本的 Requests 。这会将请求配置为使用 urllib3 对 App Engine 的 URLFetch 服务的底层支持。

于 2016-06-07T17:32:47.510 回答
9

在 Google Appengine(版本 1.9.18)上请求 版本 2.3.0(仅限! )如果您启用了计费,则可以在生产中(但不适用于 SDK),这启用了套接字支持。

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

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

PS:如果您打算在 GAE 上使用请求,请将 awsome 替换为 very-painful。

另请参阅:可以在 Google App Engine 上使用 Python 请求库吗?

于 2015-02-16T15:03:13.143 回答