【发布时间】:2011-10-13 23:20:10
【问题描述】:
我在 Python 中有一个 GAE 项目,我正在使用以下代码在我的一个 RequestHandlers 中设置一个 cookie:
self.response.headers['Set-Cookie'] = 'app=ABCD; expires=Fri, 31-Dec-2020 23:59:59 GMT'
我在 Chrome 中进行了检查,可以看到列出的 cookie,因此它似乎可以正常工作。
然后在另一个 RequestHandler 中,我得到 cookie 来检查它:
appCookie = self.request.cookies['app']
此行在执行时会出现以下错误:
UnicodeDecodeError:“ascii”编解码器无法解码位置 1962 中的字节 0xe2:序数不在范围内(128)它似乎正在尝试使用 ASCII 编解码器而不是 UTF-8 解码传入的 cookie 信息。
如何强制 Python 使用 UTF-8 对其进行解码?
作为 Python 和 Google App Engine 的新手(但对于其他语言的经验丰富的程序员),我是否需要了解其他与 Unicode 相关的问题?
这是完整的回溯:
Traceback (most recent call last):
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 4144, in _HandleRequest
self._Dispatch(dispatcher, self.rfile, outfile, env_dict)
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 4049, in _Dispatch
base_env_dict=env_dict)
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 616, in Dispatch
base_env_dict=base_env_dict)
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 3120, in Dispatch
self._module_dict)
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 3024, in ExecuteCGI
reset_modules = exec_script(handler_path, cgi_path, hook)
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/dev_appserver.py", line 2887, in ExecuteOrImportScript
exec module_code in script_module.__dict__
File "/Users/ken/hgdev/juicekit/main.py", line 402, in <module>
main()
File "/Users/ken/hgdev/juicekit/main.py", line 399, in main
run_wsgi_app(application)
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/webapp/util.py", line 98, in run_wsgi_app
run_bare_wsgi_app(add_wsgi_middleware(application))
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/webapp/util.py", line 116, in run_bare_wsgi_app
result = application(env, _start_response)
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/webapp/__init__.py", line 721, in __call__
response.wsgi_write(start_response)
File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/ext/webapp/__init__.py", line 296, in wsgi_write
body = self.out.getvalue()
File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/StringIO.py", line 270, in getvalue
self.buf += ''.join(self.buflist)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 1962: ordinal not in range(128)
【问题讨论】:
-
能否请您包含完整的堆栈跟踪信息?该问题可能出现在许多地方,完整的堆栈跟踪提供了更多详细信息。
-
就 Python 中的 Unicode 而言,请参见此处:blog.notdot.net/2010/07/Getting-unicode-right-in-Python
-
您的 cookie 中没有非 ASCII 字符(或位置 1962),因此您显示的代码完全不可能实际抛出该错误。
-
感谢 Wooble 的建设性和有益的回复。不幸的是,您的陈述毫无意义,因为代码实际上抛出了我所说的错误。不理解不代表不可能。
-
嗨尼克...添加了完整的追溯。谢谢。
标签: python google-app-engine cookies unicode character-encoding