przez kilka ostatnich dni (w trakcie dziwnej godziny, którą mogę wydać na ten projekt), staram się zacząć korzystać z Dysku Google API z kontem usługi w pythonie GAE, do lokalnego debugowania.Korzystanie z interfejsu Google Drive API z kontem usługi w Google Apps Engine - projekt python z lokalnym debugowaniem
Moja konfiguracja:
- Eclipse 4.4
- Google App Engine SDK dla Python 1.8.0
- klient Google API Python GAE 1,1
mam aktywny (między innymi) te zewnętrzne biblioteki w app.yaml:
- name: pycrypto
version: latest
- name: ssl
version: latest
To co rozumiem o konfiguracji dalece, w kilku stwierdzeń:
- ponieważ moja aplikacja nie wymaga dostępu do plików użytkownika, ale plik, który jest specyficzny dla aplikacji, aplikacja powinna używać a „konto usługi” do posiadania i dostępu do pliku na Dysku Google kont usług
- może uwierzytelnić się na dwa sposoby: (1) przez klucz API i (2) za pomocą klucza prywatnego poświadczeń
- przy opracowywaniu aplikacji GAE za pomocą SDK , istnieją dwa środowiska, które należy wziąć pod uwagę: system lokalny (do debugowania) i serwer GAE (do wdrożenia)
- Klucz uwierzytelniania API nie działa (i nigdy nie będzie działać) podczas działania w systemie lokalnym, z powodu uwierzytelniania dwunożnego (nie całkiem to rozumiem ..., ale wydaje się to prawdą)
Naprawdę chcę Lokalne narzędzie do debugowania, ponieważ uczę się Pythona i uczę się interfejsu drive google, więc debugowanie na serwerze jest dużym obciążeniem.
Muszę uzyskać poświadczenia klucza prywatnego działające w systemie lokalnym. Ale wtedy wpadam na problem "ImportError: nie mogę zaimportować nazwy SignedJwtAssertionCredentials". Próbowaliśmy prawie wszystko, co znalazłem na stronie:
- pomocą python 2.7 czas pracy i włączyć bibliotekę pycrypto
- modernizacja google-api-python-client-GAE do 1,1 (który zawiera tę poprawkę)
- zainstalowany OpenSSL w moim systemie (ale prawdopodobnie nie uda się ustawiając odpowiednie ścieżki)
- instrukcji odczytu, aby zainstalować pycrypto lokalnie, ale zakłada się, że były przestarzałe
=> moje pierwsze pytanie, po prostu understan d, czy: czy w ogóle możliwe jest uwierzytelnianie w systemie lokalnym z zestawu SDK GAE do interfejsu API Dysku Google przy użyciu Pythona? Może odpowiedź jest po prostu "nie"?
=> jeśli odpowiedź brzmi "tak", to czy istnieje przykładowa konfiguracja i przykładowy kod dla pokazania sposobu osiągnięcia tego lokalnego uwierzytelnienia?
=> Dziennik błędów (poniżej) sugeruje, że nadal występuje problem z niedostępnością programu pycrypto, ale dokumenty wyraźnie mówią, że jest on zawarty w środowisku wykonawczym Python 2.7 GAE.
=> może (proszę potwierdzić) Jestem zdezorientowany różnicą między lokalną i serwerową konfiguracją pytona. Kiedy patrzę w Eclipse na PYTHONPATH "Run Local", zawiera on (1) moje foldery projektu, (2) foldery google-api-client-python-gae (które nie zawierają pycrypto !!), podczas gdy środowisko wykonawcze GAE robi - jaka jest różnica? i (3) moje lokalne wdrożenie Pythona 2.7. Więc czego brakuje w tej lokalnej konfiguracji, której potrzebuję naśladować konfigurację serwera, aby rozpocząć debugowanie?
To jest mój kod do uwierzytelniania przy użyciu klucza prywatnego poświadczeń:
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)
To mój dziennik błędów:
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.
[aktualizacja] przeglądając moje pytanie, myślę, że będę musiał się bliżej przyjrzyj się instalacji lokalnej pycrypto. Jeśli to jest poprawka, zamierzam wyrazić opinię na temat this article, aby poprosić o dodanie uwagi o rozbieżnościach pomiędzy bibliotekami środowiska wykonawczego serwera GAE i lokalnymi bibliotekami SDK. I tutaj dodam instrukcję instalacji.
[aktualizacja2] Problem z logowaniem SignedJwtAssertionCredentials zniknął, ale pojawił się kolejny problem z importem pakietu tlslite. Nie miałem pojęcia, jak to naprawić, ponieważ import wyglądał idealnie rozsądnie, i uciekałem się do rekonfiguracji całego IDE od zera. Mam teraz zainstalowany another precompiled pycrypto library i poszedłem za podpowiedź w komunikacie o błędzie, i konwertowałem mój plik klucza prywatnego .p12 do pliku .pem. Zauważ, że plik .pem utworzony przez openssl zawierał 4 linie tekstu przed "----- BEGIN", które musiałem usunąć ręcznie, aby plik .pem został rozpoznany przez oauth2client!
[aktualizacja3] podczas rekonfiguracji IDE od zera, przeoczyłem, aby używać "old_dev_appserver.py" do uruchamiania aplikacji lokalnie, zamiast "dev_appserver.py". The latter will not enable breakpoints! Wygląda jednak na to, że ma to coś wspólnego z problemem importu SignedJwtAssertionCredentials. Używając "dev_appserver.py", nie mam problemu z importem (ale nie ma punktów przerwania) i używając "old_dev_appserver.py", mogę odtworzyć problem z importem. Tak więc "old_dev_appserver.py" może być częścią całego problemu!
[dokument informujący o korzystaniu z kont usług] (https://developers.google.com/api-client-library/python/guide/google_app_engine#ServiceAccounts) – vicmortelmans
[dokument z dwiema metodami uwierzytelniania konta usługi] (https://developers.google.com/drive/service-accounts) – vicmortelmans
[podobny problem z poprawką, która nie rozwiązuje niczego dla mnie] (http://stackoverflow.com/questions/12823366/using-appidentitycredential-with-google -drive-api) – vicmortelmans