Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
oauth2client/appengine.py返回“;InvalidResponseError:头值必须是str、get和x27;unicode'&引用;使用webapp2/python27/wsgi_Python_Google App Engine_Oauth 2.0 - Fatal编程技术网

oauth2client/appengine.py返回“;InvalidResponseError:头值必须是str、get和x27;unicode'&引用;使用webapp2/python27/wsgi

oauth2client/appengine.py返回“;InvalidResponseError:头值必须是str、get和x27;unicode'&引用;使用webapp2/python27/wsgi,python,google-app-engine,oauth-2.0,Python,Google App Engine,Oauth 2.0,在此之前,我的问题类似于问题,有几个,但在我的案例中没有一个有用。另外,我没有答案(它本身看起来很像,所以我在这里尝试) 在本地GAE上,下面的简单示例(简化版&python27)返回InvalidResponseError:header值必须是str,get'unicode',尽管我的代码没有进行任何unicode头设置。更准确地说,我期望的结果是Hello,相反,我有: Internal Server Error The server has either erred or is i

在此之前,我的问题类似于问题,有几个,但在我的案例中没有一个有用。另外,我没有答案(它本身看起来很像,所以我在这里尝试)

在本地GAE上,下面的简单示例(简化版&python27)返回
InvalidResponseError:header值必须是str,get'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上使用Python2.7.3上的GAE 1.7.5

EDIT:Jonas在中提供了一个答案:“在OAuth2WebServerFlow上生成URL的方法中添加一些str()应该相对容易。在oauth2client/client.py的第830行返回之前使用str()进行包装”。
→ 这看起来很好,但我应该如何实现呢?我同意我可以在安装GAE的本地机器上修改文件,但一旦部署,将使用谷歌的GAE,对吗?我如何覆盖它?(对于新手的问题,我很抱歉)

谢谢你的帮助


应用程序yaml

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

handlers:

- url: /
  script: yourapp.main

libraries:
- name: webapp2
  version: latest
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)

yourapp.py

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

handlers:

- url: /
  script: yourapp.main

libraries:
- name: webapp2
  version: latest
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)

我使用的是GAE的捆绑版python API,这显然是不应该的。在安装了项目中托管的
google-API-python-client-1.1
之后,一切都如期进行。

我遇到了同样的问题,尽管我已经在使用最新版本的apiclient

我解决这个问题的答案发布在这里的问题跟踪程序中

不起作用

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()包装流。step1_get_authorize_url调用

还有另一个答案…添加str()可以解决问题,但不能解决根本原因。我花了几个小时试图弄清楚为什么某个特定重定向会引发此错误,而其他重定向不会引发此错误,然后才注意到错误重定向的url缺少初始“/”

我不知道为什么会出现这种情况-不完整路径的处理方式可能与完整路径不同。但如果遇到此错误,请尝试更改:

self.redirect('home.view')
致:


Jonas在中给出了答案:“在OAuth2WebServerFlow上生成URL的方法中添加一些str()应该相对容易。在oauth2client/client.py的第830行返回之前使用str()包装”.这看起来很好,但我应该如何实现呢?我同意我可以在安装GAE的本地计算机上修改文件,但一旦部署,将使用谷歌的GAE,对吗?我如何覆盖它?(对于新手问题,我很抱歉)有点晚了,但你的回答刚才仍然帮助了我。+1