5

前もって、私の問題は質問に似ていますPyramid on App Engine gets "InvalidResponseError: header values must be str, got 'unicode' , and some google-api-python-client bugs , but no none help for my case. Also, I had no問題 #254の回答(それ自体は#111に似ているため、ここで試しています。

ローカル GAE では、以下の簡単な例 (このサンプルの単純化された & python27 化されたバージョン) が返されますInvalidResponseError: header values must be str, got 'unicode'が、私のコードはUnicode ヘッダー設定を行っていません。より正確には、私は結果を期待していHelloますが、代わりに次のようにしています:

Internal Server Error
    The server has either erred or is incapable of performing the requested operation.
    Traceback (most recent call last):
      File "/home/ronj/.gae/lib/webapp2-2.5.2/webapp2.py", line 1546, in __call__
        return response(environ, start_response)
      File "/home/ronj/.gae/lib/webob_0_9/webob/__init__.py", line 2000, in __call__
        start_response(self.status, self.headerlist)
      File "/home/ronj/.gae/google/appengine/runtime/wsgi.py", line 156, in _StartResponse
        (_GetTypeName(value), value, name))
    InvalidResponseError: header values must be str, got 'unicode' (u'https://accounts.google.com/o/oauth2/auth?state=http%3A%2F%2Flocalhost%3A8080%2F&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2Foauth2callback&response_type=code&client_id=xxxxxxxxxxxx.apps.googleusercontent.com&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fyoutube&access_type=offline') for 'Location'

何か案が?Ubuntu 12.10 x64 の Python 2.7.3 で GAE 1.7.5 を使用しています。

編集: Jonas は問題 #254で回答を提供しました: 「URL を生成する OAuth2WebServerFlow のメソッドに str() を追加するのは比較的簡単なはずです。oauth2client/client.py の 830 行目に戻る前に str() でラップします」 .
→ 良さそうに見えるけど、どうやって実装すればいいの?GAE をインストールしたローカル マシン上のファイルを変更できることに同意しますが、展開すると、使用されるのは Google の GAE になりますよね? どうすれば上書きできますか? (そして初歩的な質問ですみません)

ご協力いただきありがとうございます!


app.yaml :

application: yourapp
version: 1
runtime: python27
api_version: 1
threadsafe: true

handlers:

- url: /
  script: yourapp.main

libraries:
- name: webapp2
  version: latest

yourapp.py :

import webapp2, os, httplib2
from apiclient.discovery import build
from oauth2client.appengine import oauth2decorator_from_clientsecrets
from google.appengine.api import memcache

CLIENT_SECRETS = os.path.join(os.path.dirname(__file__), 'client_secrets.json')
MISSING_CLIENT_SECRETS_MESSAGE = "Warning: Please configure OAuth 2.0"
YOUTUBE_READ_WRITE_SCOPE = "https://www.googleapis.com/auth/youtube"
YOUTUBE_API_SERVICE_NAME = "youtube"
YOUTUBE_API_VERSION = "v3"

http = httplib2.Http(memcache)
youtube = build(YOUTUBE_API_SERVICE_NAME, YOUTUBE_API_VERSION, http=http)
decorator = oauth2decorator_from_clientsecrets(
    CLIENT_SECRETS,
    scope=YOUTUBE_READ_WRITE_SCOPE,
    message=MISSING_CLIENT_SECRETS_MESSAGE)


class MainPage(webapp2.RequestHandler):

  @decorator.oauth_required
  def get(self):
    self.response.headers['Content-Type'] = 'text/plain'
    self.response.write('Hello')

main = webapp2.WSGIApplication([('/', MainPage)], debug=True)
4

3 に答える 3

4

すでに最新バージョンの apiclient を使用していたにもかかわらず、この同じ問題に遭遇しました。

この問題を解決するために私のために働いた答えは、http://code.google.com/p/google-api-python-client/issues/detail ?id=254 のイシュー トラッカーに投稿されたとおりです。

機能しない

flow = client.flow_from_clientsecrets(CLIENT_SECRETS,scope=scopes)
callback = self.request.relative_url('/oauth2callback')
auth_url = flow.step1_get_authorize_url(callback)
return self.redirect(auth_url)

働く

flow = client.flow_from_clientsecrets(CLIENT_SECRETS,scope=scopes)
callback = self.request.relative_url('/oauth2callback')
auth_url = str(flow.step1_get_authorize_url(callback))
return self.redirect(auth_url)

str() が flow.step1_get_authorize_url 呼び出しをラップしていることに注意してください。

于 2014-01-06T13:38:25.413 に答える
2

さらに別の答え... str() を追加すると問題は解決しますが、根本的な原因は解決しません。特定のリダイレクトでこのエラーが発生し、他のリダイレクトでは発生しなかった理由を突き止めるのに何時間も費やした後、不正なリダイレクトの URL の最初の「/」が欠落していることに気付きました。

なぜそうなのかはわかりません。不完全なパスは完全なパスとは異なる方法で処理される可能性があります。ただし、このエラーが発生した場合は、次のように変更してみてください。

self.redirect('home.view')

に:

self.redirect('/home.view')
于 2014-04-09T05:36:12.987 に答える