2012-03-07 13 views

risposta

25

Sì. Su Google Appengine (versione 1.9.18) requestsversione 2.3.0 funziona IN PRODUZIONE (ma non su SDK) se la fatturazione è abilitata, il che abilita il supporto dei socket.

Aggiornamento: A partire dal 31 gennaio 2017 Richieste sta lavorando in produzione con la versione 2.9.1 in produzione. Tuttavia, non funziona con Google Cloud SDK 141.0.0

richieste sul AppEngine SDK viene a mancare con tutti i https: // richieste:

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

richieste di versione 2.4.1 non riesce in produzione con:

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

richieste versione 2.5.1 non riesce in produzione con:

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

richieste di versione 2.3.0 funziona in produzione, ma può causare problemi con Debians rimosso il supporto SSLv3 nell'SDK (le richieste 2.3.0 vengono fornite con il proprio urllib3 ormai obsoleto). Come soluzione alternativa, è possibile eliminare la riga contenente PROTOCOL_SSLv3 nell'origine della copia urllib3 della richiesta.

'module' object has no attribute 'PROTOCOL_SSLv3' 

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

+3

è possibile correggere le richieste https: // semplicemente caricando la libreria SSL http://stackoverflow.com/a/34135758/172322 – Yahel

+0

le richieste a un sito Web https funzionano anche quando non si abilita la fatturazione: perché? –

+0

Ho appena scoperto che finché la libreria socket non viene effettivamente utilizzata (dalla libreria richiesta), App Engine non genererà un'eccezione se la fatturazione non è stata abilitata (cioè le importazioni inutilizzate e il codice non utilizzato va bene). Questo perché ho fatto solo richieste GET semplici. Ciò che è stato effettivamente chiamato nel codice sottostante era la libreria di raccolta URL di App Engine quando ho controllato la mia quota utilizzata (nel mio caso d'uso, utilizzando urllib2 invece di richieste potrebbe essere un'opzione migliore). Inoltre, funziona senza includere la libreria SSL per il mio caso; Il recupero dell'URL di App Engine supporta https –

7

Non ancora, ma si spera molto presto. È stato elaborato il supporto per GAE - vedere il numero #498 (Correzioni del motore app).

Richieste utilizza urllib3 che a sua volta utilizza httplib quale is supportato su GAE come wrapper per urlfetch API. Sebbene urllib3 utilizzi alcuni moduli non disponibili su GAE, questo utilizzo viene effettuato deliberatamente optional in modo che urllib3 possa essere utilizzato su GAE.

+0

sai se questo è già cambiato? – clifgray

+0

Non ce l'ho, ma puoi chiedere nel numero dalla risposta. –

+1

funziona correttamente ora. – clifgray

3

No, in un more recent post, gli sviluppatori dicono di non supportare GAE perché è troppo diverso da Python.

+0

Non lo supportano, ma puoi ancora utilizzare la libreria. Basta scaricare la fonte e importarla direttamente. Se hai bisogno di usare i socket per aggirare i limiti di 'urlfetch()', usa [socket] (https://developers.google.com/appengine/docs/python/sockets/) – user3058197

+0

Ho provato che, non avrebbe importato esso. –

+0

Hai socket abilitati? – user3058197

25

installare la libreria requests-toolbelt: https://github.com/sigmavirus24/requests-toolbelt

Per App Engine potrebbe essere qualcosa di simile: pip install requests-toolbelt -t lib

(Vedi: https://cloud.google.com/appengine/docs/python/tools/using-libraries-python-27#installing_a_library)

Quindi aggiungere:

from requests_toolbelt.adapters import appengine 
appengine.monkeypatch() 

Nel tuo main.py o equivalente.

Modifica: questa soluzione è ora parte della documentazione ufficiale: https://cloud.google.com/appengine/docs/python/issue-requests#issuing_an_http_request (nella scheda REQUESTS)

+0

Questa dovrebbe essere la risposta accettata! – Alex

+1

FYI, la riga appengine.monkeypatch() dovrebbe essere nelle importazioni prima di importare eventuali moduli che utilizzano le richieste. –

5

questo è ora possibile, ho ottenuto che funziona utilizzando questa combinazione di soluzioni alternative in 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' 
+0

Grazie, tranne per il fatto che non è necessario alcun rientro per 'def platform()' – vkb

+0

grazie! il codice è ora aggiornato sopra – jcjones1515

+0

questa dovrebbe essere la risposta accettata in quanto per ora Google scrive questo nella loro documentazione. works_toolbelt monkey patch funziona. –

Problemi correlati