2012-03-18 74 views
23

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

我可以成功

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' 
+0

可能重复[要求:HTTP人类 - python-requests.org在谷歌应用程序引擎(http://stackoverflow.com/questions/9604799/requests-http-for-humans-python-requests- org-on-google-app-engine) – 2012-04-07 18:06:48

回答

13

如前所述,master branch of standalone urllib3理应支持的AppEngine现在(我会做一个适当的PyPI发布一次有人证实了这一事实),但要求还不支持AppEngine上,因为它使有关各种文件系统的东西加载配置文件假设这在AppEngine上不存在。具体来说,您遇到的错误与加载~/.netrc配置文件有关。

参见Issue #493

对于它的价值,在urllib3相当于将是:

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

更新:urllib3 v1.3昨天,包括AppEngine上支持释放。

+0

非常感谢,shazow。我正在App Engine上成功使用修补后的urllib3。猜猜我们必须看到抽象出一些这种低级文件系统的东西是多么困难。 – rd108 2012-03-19 00:24:28

9

对谷歌的AppEngine生产工作(1.9.18版)requests版本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。

另请参见:Can Python Requests library be used on Google App Engine?

+0

但可以使用[urlfetch](https://cloud.google.com/appengine/docs/python/urlfetch/)。不知道是否有可能使'请求'使用它。 – wlnirvana 2015-02-23 11:34:10

+0

否。请求的维护者不支持appengine。在大多数情况下,您可以很容易地将来自第三方库的调用替换为/使用urlfetch更改请求,或者直接通过兼容调用urlfetch来请求请求。我们有一个名为fake_requests.py的模块来模拟请求。 – cat 2015-03-07 10:39:08

+0

版本2.3.0确实为我做了诡计。请参阅http://stackoverflow.com/questions/29301863/google-app-engine-and-human-api-python-lib – 2015-03-28 17:59:41