事先,我的问题类似于App Engine 上的 Pyramid gets "InvalidResponseError: header values must be str, got 'unicode'和几个google-api-python-client bugs,但对我的情况没有帮助。另外,我没有回答问题 #254(它本身看起来类似于#111,所以我在这里尝试。
在本地 GAE 上,下面的简单示例(此示例的简化和 python27 化版本)返回InvalidResponseError: header values must be str, got 'unicode'
,尽管我的代码没有进行任何 unicode 标头设置。更准确地说,我期待 result 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。
编辑:乔纳斯在问题 #254中提供了一个答案:“在 OAuth2WebServerFlow 上生成 URL 的方法中添加一些 str() 应该相对容易。在 oauth2client/client.py 中的第 830 行返回之前用 str() 包装”。
→ 看起来不错,但我应该如何实现呢?我同意我可以在我安装了 GAE 的本地计算机上修改文件,但是一旦部署,它将使用 Google 的 GAE,对吗?我怎样才能覆盖它?(很抱歉新手的问题)
谢谢你的帮助!
应用程序.yaml:
application: yourapp
version: 1
runtime: python27
api_version: 1
threadsafe: true
handlers:
- url: /
script: yourapp.main
libraries:
- name: webapp2
version: latest
你的应用程序.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)