0

Я пытаюсь использовать oauth2 с моим приложением App Engine, но я получаю следующее сообщение об ошибке:Проблем с oauth2client.client.Storage

Encountered unexpected error from ProtoRPC method implementation: IOError ([Errno 30] Read-only file system: 'credentials.dat') 
Traceback (most recent call last): 
    File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/protorpc-1.0/protorpc/wsgi/service.py", line 181, in protorpc_service_app 
    response = method(instance, request) 
    File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/endpoints-1.0/endpoints/api_config.py", line 1332, in invoke_remote 
    return remote_method(service_instance, request) 
    File "/base/data/home/runtimes/python27/python27_lib/versions/third_party/protorpc-1.0/protorpc/remote.py", line 412, in invoke_remote_method 
    response = method(service_instance, request) 
    File "/base/data/home/apps/s~art-everywhere/7.385356767964097452/main.py", line 438, in upload_putphoto 
    gd_client = PicasaWA.login() 
    File "/base/data/home/apps/s~art-everywhere/7.385356767964097452/main.py", line 1653, in login 
    storage.put(credentials) 
    File "/base/data/home/apps/s~art-everywhere/7.385356767964097452/oauth2client/client.py", line 325, in put 
    self.locked_put(credentials) 
    File "/base/data/home/apps/s~art-everywhere/7.385356767964097452/oauth2client/file.py", line 113, in locked_put 
    f = open(self._filename, 'wb') 
IOError: [Errno 30] Read-only file system: 'credentials.dat' 
Похоже, что есть проблема с записью, используемой в библиотеке ,

Вот фрагмент кода, я использовал:

def login(cls): 
    scope = 'https://picasaweb.google.com/data/' 
    user_agent = 'picasawebuploader' 
    # credential_store = os.path.join(os.path.split(__file__)[0], "credentials.dat") 

    storage = Storage("credentials.dat") 
    # storage = Storage(credential_store) 
    credentials = storage.get() 

    # user = users.get_current_user() 
    # storage = StorageByKeyName(CredentialsModel, user.user_id(), 'credentials') 
    # credentials = storage.get() 

    if credentials is None or credentials.invalid: 
     flow = flow_from_clientsecrets("client_secrets.json", scope=scope, redirect_uri='urn:ietf:wg:oauth:2.0:oob') 
     uri = flow.step1_get_authorize_url() 
     logging.info("uri: %s", uri) 
     webbrowser.open(uri) 
     code = "Here I posted the code retrived by the autentication" 
     credentials = flow.step2_exchange(code) 
     storage.put(credentials) 

    if (credentials.token_expiry - datetime.utcnow()) < timedelta(minutes=5): 
     http = httplib2.Http() 
     http = credentials.authorize(http) 
     credentials.refresh(http) 

    gd_client = gdata.photos.service.PhotosService(source=user_agent, 
                email=USERNAME, 
                additional_headers={'Authorization' : 'Bearer %s' % credentials.access_token}) 

    return gd_client 

Что я делаю неправильно? Спасибо всем за помощь!

ответ

0

Вы не можете создавать файлы в AppEngine, как в обычной файловой системе, it's read-only. Вам нужно использовать специальный AppEngine credentials and storage objects.

+0

Да, я был в курсе этого ограничения двигателя App. Но, как вы можете видеть в фрагменте кода, я использовал специальный объект хранения, предоставленный библиотекой App Engine Oauth2. Глядя на учебники, мне кажется, что я следовал за правильными шагами ... Не могли бы вы сказать, что я делаю неправильно и как исправить код, чтобы заставить его работать? Я был бы очень благодарен вам, если бы вы помогли мне решить эту неприятную проблему. –

0

Включите эту же проблему с помощью devserver на моей локальной машине. Решение было некрасиво, но this change решил это для меня. Я не уверен, что вы сможете запустить storage.put(credentials) из приложения appengine. Возможно, это связано с большой проблемой. Выполнение потока oauth как части отдельного сценария, а затем загрузка учетных данных из файла на самом деле работало для меня после изменения devserver.

Я очень сомневаюсь, что это на самом деле работает в производстве, хотя, так что вы можете захотеть взглянуть на Delegating domain-wide authority to the service account

Смежные вопросы