Note that there are some explanatory texts on larger screens.

plurals
  1. POoauth2client/appengine.py returns "InvalidResponseError: header values must be str, got 'unicode'" with webapp2/python27/wsgi
    text
    copied!<p>Beforehand, my problem is similar to question <a href="https://stackoverflow.com/questions/9934923/pyramid-on-app-engine-gets-invalidresponseerror-header-values-must-be-str-got"><em>Pyramid on App Engine gets "InvalidResponseError: header values must be str, got 'unicode'</em></a>, and several <a href="http://code.google.com/p/google-api-python-client/issues/list" rel="nofollow noreferrer">google-api-python-client bugs</a>, but none helped in my case. Also, I had no answer on <a href="http://code.google.com/p/google-api-python-client/issues/detail?id=254" rel="nofollow noreferrer">issue #254</a> (which itself looks similar to <a href="http://code.google.com/p/google-api-python-client/issues/detail?id=111" rel="nofollow noreferrer">#111</a>, so I'm trying here.</p> <p>On a local GAE, the simple example below (a simplified &amp; python27-ified version of <a href="http://code.google.com/p/google-api-python-client/source/browse/samples/appengine/main.py" rel="nofollow noreferrer">this sample</a>) returns <code>InvalidResponseError: header values must be str, got 'unicode'</code>, though my code is <em>not</em> doing any unicode header setting. More precisely, I'm expecting result <code>Hello</code>, and instead I have:</p> <pre><code>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&amp;redirect_uri=http%3A%2F%2Flocalhost%3A8080%2Foauth2callback&amp;response_type=code&amp;client_id=xxxxxxxxxxxx.apps.googleusercontent.com&amp;scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fyoutube&amp;access_type=offline') for 'Location' </code></pre> <p>Any idea? I am using GAE 1.7.5 on Python 2.7.3 on Ubuntu 12.10 x64.</p> <p><strong>EDIT</strong>: Jonas provided an answer in <a href="http://code.google.com/p/google-api-python-client/issues/detail?id=254" rel="nofollow noreferrer">issue #254</a>: <em>"it should be relatively easy to add some str() into the methods on OAuth2WebServerFlow that generates URLs. Wrap with str() before return on line 830 in oauth2client/client.py"</em>.<br> &rarr; That looks great, but how am I supposed to implement that? I agree that I can modify the file on my local machine where I installed GAE, but once deployed it will be Google's GAE that will be used, right? How can I override it? (and sorry for the newbie question)</p> <p>Thanks for your help!</p> <hr> <p><strong>app.yaml</strong>:</p> <pre><code>application: yourapp version: 1 runtime: python27 api_version: 1 threadsafe: true handlers: - url: / script: yourapp.main libraries: - name: webapp2 version: latest </code></pre> <hr> <p><strong>yourapp.py</strong>:</p> <pre><code>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) </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload