negli ultimi due giorni (durante l'ora dispari che posso spendere per questo progetto), ho avuto difficoltà a iniziare a utilizzare Google Drive API con un account di servizio in GAE python, per il debugging locale.Utilizzo dell'API di Google Drive con account di servizio nel progetto python di Google Apps Engine con debug locale
La mia configurazione:
- Eclipse 4.4
- Google App Engine SDK per Python 1.8.0
- Google client API Python GAE 1,1
Ho attivato (tra gli altri) queste librerie di terze parti in app.yaml:
- name: pycrypto
version: latest
- name: ssl
version: latest
.210
Questo è quello che ho capito sulla configurazione sofar, in un paio di dichiarazioni:
- perché la mia applicazione non ha bisogno di accedere ai file degli utenti, ma un file che è specifico per l'applicazione, l'applicazione dovrebbe utilizzare un account di servizio per possedere e accedere al file su Google Drive
- account di servizio possono autenticarsi in due modi: (1) tramite chiave API e (2) con credenziali di chiave privata
- durante lo sviluppo di un'app GAE utilizzando l'SDK , ci sono due ambienti da tenere in considerazione: il sistema locale (per il debug) e il server GAE (per la distribuzione)
- autenticazione della chiave API non funziona (e non funzionerà mai) durante l'esecuzione sul sistema locale, a causa della autenticazione a due zampe (non completamente afferrare questo ..., ma sembra vero)
voglio davvero il funzionalità di debugging locale, perché sto imparando Python e sto imparando l'interfaccia di google drive, quindi il debugging sul server è un grande onere.
Quindi ho bisogno di ottenere le credenziali della chiave privata che funzionano sul sistema locale. Ma poi mi imbatto nel problema "ImportError: impossibile importare il nome SignedJwtAssertionCredentials". Ho provato quasi tutto ciò che ho trovato sul web:
- utilizzando il runtime di Python 2.7 e abilitare la libreria pycrypto
- riqualificazione google-api-python-client-gae a 1.1 (che include questa correzione)
- installato OpenSSL sul mio sistema (ma probabilmente non riuscirà a impostare i percorsi di destra)
- istruzioni di lettura per installare pycrypto a livello locale, ma assunti erano obsolete
=> la mia prima domanda, solo per understan d, è: è possibile eseguire l'autenticazione sul tuo sistema locale dall'SDK di GAE all'API di Google Drive utilizzando Python? Forse la risposta è semplicemente "no"?
=> se la risposta fosse "sì", ci sarebbe un esempio di esempio di configurazione e codice per mostrare il modo per ottenere questa autenticazione locale?
=> il log degli errori (sotto) sembra suggerire che c'è ancora un problema con pycrypto non essere disponibile, ma i documenti dicono esplicitamente che è incluso nell'ambiente di runtime GAE Python 2.7.
=> forse (si prega di confermare) Sono confuso dalla differenza tra installazione locale e server python. Quando guardo in Eclipse nel PYTHONPATH "Esegui locale", include (1) le mie cartelle di progetto, (2) le cartelle google-api-client-python-gae (che non sembrano includere pycrypto !!), mentre il runtime di GAE fa --- qual è la differenza? e (3) la mia distribuzione Python 2.7 locale. Quindi cosa manca in questa configurazione locale che ho bisogno di imitare la configurazione del server per avviare il debug?
Questo è il mio codice per l'autenticazione utilizzando le credenziali chiave privata:
from oauth2client.client import SignedJwtAssertionCredentials
f = file(SERVICE_ACCOUNT_PKCS12_FILE_PATH, 'rb')
key = f.read()
f.close()
credentials = SignedJwtAssertionCredentials(SERVICE_ACCOUNT_EMAIL, key, scope=OAUTH_SCOPE)
http = httplib2.Http()
http = credentials.authorize(http)
return build('drive', 'v2', http=http)
Questo mio log di errore:
ERROR 2013-06-18 00:59:57,562 dev_appserver_import_hook.py:1251] Third party package Crypto was enabled in app.yaml but not found on import. You may have to download and install it.
ERROR 2013-06-18 00:59:59,255 dev_appserver_import_hook.py:1251] Third party package Crypto was enabled in app.yaml but not found on import. You may have to download and install it.
ERROR 2013-06-18 00:59:59,289 webapp2.py:1552] import_string() failed for 'illustrations.SyncHandler'. Possible reasons are:
- missing __init__.py in a package;
- package or module path not included in sys.path;
- duplicated package or module name taking precedence in sys.path;
- missing module, class, function or variable;
Original exception:
ImportError: cannot import name SignedJwtAssertionCredentials
Debugged import:
- 'illustrations' not found.
Traceback (most recent call last):
File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 1535, in __call__
rv = self.handle_exception(request, response, e)
File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 1529, in __call__
rv = self.router.dispatch(request, response)
File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 1272, in default_dispatcher
self.handlers[handler] = handler = import_string(handler)
File "C:\Program Files (x86)\Google\google_appengine\lib\webapp2-2.5.2\webapp2.py", line 1850, in import_string
return getattr(__import__(module, None, None, [obj]), obj)
File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver_import_hook.py", line 692, in Decorate
return func(self, *args, **kwargs)
File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver_import_hook.py", line 1766, in load_module
return self.FindAndLoadModule(submodule, fullname, search_path)
File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver_import_hook.py", line 692, in Decorate
return func(self, *args, **kwargs)
File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver_import_hook.py", line 1630, in FindAndLoadModule
description)
File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver_import_hook.py", line 692, in Decorate
return func(self, *args, **kwargs)
File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver_import_hook.py", line 1577, in LoadModuleRestricted
description)
File "C:\Users\vic\Dropbox\Development\Eclipse-juno-workspace\Missale\src\illustrations.py", line 6, in <module>
import drive
File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver_import_hook.py", line 692, in Decorate
return func(self, *args, **kwargs)
File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver_import_hook.py", line 1766, in load_module
return self.FindAndLoadModule(submodule, fullname, search_path)
File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver_import_hook.py", line 692, in Decorate
return func(self, *args, **kwargs)
File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver_import_hook.py", line 1630, in FindAndLoadModule
description)
File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver_import_hook.py", line 692, in Decorate
return func(self, *args, **kwargs)
File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\dev_appserver_import_hook.py", line 1577, in LoadModuleRestricted
description)
File "C:\Users\vic\Dropbox\Development\Eclipse-juno-workspace\Missale\src\drive.py", line 6, in <module>
from oauth2client.client import SignedJwtAssertionCredentials
ImportStringError: import_string() failed for 'illustrations.SyncHandler'. Possible reasons are:
- missing __init__.py in a package;
- package or module path not included in sys.path;
- duplicated package or module name taking precedence in sys.path;
- missing module, class, function or variable;
Original exception:
ImportError: cannot import name SignedJwtAssertionCredentials
Debugged import:
- 'illustrations' not found.
[update] rivedere la mia domanda, penso che avrò bisogno di a dare un'occhiata più da vicino all'installazione di pycrypto localmente. Se questa è la soluzione, fornirò un feedback su this article per richiedere l'aggiunta di una nota sulle discrepanze tra le librerie di runtime del server GAE e le librerie SDK locali. E aggiungerò qui le istruzioni di installazione.
[update2] il problema di importazione SignedJwtAssertionCredentials era scomparso, ma un altro problema di importazione si è verificato nel pacchetto tlslite. Non avevo idea di come risolvere questo problema, perché l'importazione sembrava perfettamente sana, e ho fatto ricorso alla riconfigurazione dell'intero IDE da zero. Ora ho installato another precompiled pycrypto library e ho seguito il suggerimento nel messaggio di errore e convertito il mio file di chiave privata .p12 in un file .pem. Si noti che il file .pem creato da openssl conteneva 4 righe di testo prima del "----- BEGIN", che dovevo rimuovere manualmente in modo che il file .pem fosse riconosciuto da oauth2client!
[update3] quando si riconfigura l'IDE da zero, ho trascurato di utilizzare "old_dev_appserver.py" per eseguire l'app localmente, invece di "dev_appserver.py". The latter will not enable breakpoints! Ma sembra che abbia qualcosa a che fare con il problema di importazione SignedJwtAssertionCredentials. Utilizzando 'dev_appserver.py', non ho il problema di importazione (ma nessun breakpoint), e usando 'old_dev_appserver.py', posso riprodurre il problema dell'importazione. Quindi il 'old_dev_appserver.py' potrebbe aver fatto parte del problema da sempre!
[doc dicendo sull'utilizzo degli account di servizio] (https://developers.google.com/api-client-library/python/guide/google_app_engine#ServiceAccounts) – vicmortelmans
[doc con due metodi di autenticazione dell'account di servizio] (https://developers.google.com/drive/service-accounts) – vicmortelmans
[problema simile con la correzione che non sembra risolvere nulla per me] (http://stackoverflow.com/questions/12823366/using-appidentitycredential-with-google -drive-api) – vicmortelmans