事先,我的问题类似于问题 Pyramid on App Engine gets “InvalidResponseError: header values must be str, got ‘unicode’ 和几个 google-api-python-client bugs,但在我的案例中没有任何帮助.另外,我在 issue #254没有
在本地GAE上,下面的简单示例(简化& python27-ified版本this sample)返回InvalidResponseError:标头值必须是str,得到’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在issue #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)即使我已经使用了最新版本的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调用