2013-06-17 7 views
7

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!

+0

[dokument informujący o korzystaniu z kont usług] (https://developers.google.com/api-client-library/python/guide/google_app_engine#ServiceAccounts) – vicmortelmans

+0

[dokument z dwiema metodami uwierzytelniania konta usługi] (https://developers.google.com/drive/service-accounts) – vicmortelmans

+0

[podobny problem z poprawką, która nie rozwiązuje niczego dla mnie] (http://stackoverflow.com/questions/12823366/using-appidentitycredential-with-google -drive-api) – vicmortelmans

Odpowiedz

1

Tak - możesz użyć SignedJwtAssertionCredentials do łączenia się z usługami Google. Napisałem kod, który robi to za jednym razem i działa świetnie. Używanie tej klasy to jeden problem. Na GAE jest udostępniana biblioteka PyCrypto, tak jak napisałeś, ale lokalnie musisz ją zainstalować ręcznie. GAE ma własną zmienioną wersję tej biblioteki, więc nie podał jej kodu źródłowego. Drugi problem z tą biblioteką polega na tym, że jest ona kompilowana dla określonej maszyny, która jej użyje. Jeśli spojrzysz na kod źródłowy tej klasy, zobaczysz, że potrzebuje pewnych zależności do działania. Jeśli nie spełniają wymagań tej klasy, nie będzie ona dostępna z zewnętrznego kodu.

O problemach z importem starego i nowego serwera dev_server nie mogę nic napisać, ponieważ nic o tym nie wiem.

Powiązane problemy