2012-03-18 4 views
23

Sto provando a utilizzare la fantastica libreria Richieste su Google App Engine. Ho trovato una patch per urllib3, su cui si basano le richieste, che è compatibile con App Engine. https://github.com/shazow/urllib3/issues/61Utilizzo della libreria python Requests in Google App Engine

posso con successo

import requests 

ma poi

response = requests.get('someurl') 

riesce con il seguente traceback. Cosa sta succedendo?

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

possibile duplicato di [Richieste: HTTP per gli esseri umani - python-requests.org su Google App Engine] (http://stackoverflow.com/questions/9604799/requests-http-for-humans-python-requests- org-on-google-app-engine) –

risposta

13

Come accennato, master branch of standalone urllib3 supporta presumibilmente AppEngine ora (farò un rilascio adeguato PyPI una volta che qualcuno conferma di questo fatto), ma le richieste non supporta ancora AppEngine dal momento che rende ipotesi di varie cose filesystem per caricare i file di configurazione che non esistono su AppEngine. In particolare, l'errore che hai riscontrato ha a che fare con il caricamento del file di configurazione ~/.netrc.

Vedi Issue #493.

Per quello che vale, l'equivalente in urllib3 sarebbe:

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

Aggiornamento:urllib3 v1.3 è stato rilasciato ieri, che include il supporto AppEngine.

+0

grazie mille, shazow. Sto usando il tuo urllib3 con patch su App Engine con successo. Immagino che dovremo vedere quanto sia difficile l'astrazione di alcuni di questi file di basso livello. – rd108

9

Su Google AppEngine (versione 1.9.18) requestsversione 2.3.0 (solo!) funziona IN PRODUZIONE (ma non su SDK) se avete abilitato la fatturazione, che abilita il supporto socket.

richieste sul AppEngine SDK non riesce con tutti i https: // richieste:

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

richieste di versione 2.4.1 viene a mancare con:

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

richieste di versione 2.5.1 viene a mancare con:

Informazioni sul supporto socket: https://cloud.google.com/appengine/docs/python/sockets/

PS: sostituire awsome con molto doloroso se si intende utilizzare le richieste su GAE.

Vedere anche: Can Python Requests library be used on Google App Engine?

+0

Ma è possibile utilizzare [urlfetch] (https://cloud.google.com/appengine/docs/python/urlfetch/). Mi chiedo se è possibile fare 'richieste' usarlo. – wlnirvana

+0

No. I manutentori delle richieste non supportano appengine. Nella maggior parte dei casi è possibile sostituire/monkeypatch le chiamate da librerie di terze parti a richieste con urlfetch abbastanza facilmente, oppure è possibile memorizzare le richieste direttamente con chiamate compatibili a urlfetch. Avevamo un modulo chiamato fake_requests.py che emulava richieste. – cat

+0

versione 2.3.0 ha davvero fatto il trucco per me. Vedi http://stackoverflow.com/questions/29301863/google-app-engine-and-human-api-python-lib –