奇怪的GAE Python编码问题

2 投票
2 回答
536 浏览
提问于 2025-04-17 07:59

我正在尝试从Twitter获取推文,并通过GAE中的xmpp API发送到GTalk。不过,我遇到了一个很奇怪的问题。

我已经成功从Twitter获取了数据。但是在使用XMPP API发送这些数据时出现了错误。根据追踪信息,错误发生在GAE的代码中,而不是我自己的代码。我用Python2.5测试了特定的推文,它能够正确处理推文的文本,而且那条推文只包含英文字符。

ERROR    2011-12-08 14:29:54,200 dev_appserver.py:2700] Exception encountered handling request
Traceback (most recent call last):
  File "/home/google_appengine/google/appengine/tools/dev_appserver.py", line 2641, in _HandleRequest
    self._Dispatch(dispatcher, self.rfile, outfile, env_dict)
  File "/home/google_appengine/google/appengine/tools/dev_appserver.py", line 2528, in _Dispatch
    base_env_dict=env_dict)
  File "/home/google_appengine/google/appengine/tools/dev_appserver.py", line 616, in Dispatch
    base_env_dict=base_env_dict)
  File "/home/google_appengine/google/appengine/tools/dev_appserver.py", line 1592, in Dispatch
    self._module_dict)
  File "/home/google_appengine/google/appengine/tools/dev_appserver.py", line 1517, in ExecuteCGI
    logservice_stub._flush_logs_buffer()
  File "/home/google_appengine/google/appengine/api/logservice/logservice_stub.py", line 71, in _flush_logs_buffer
    logservice.logs_buffer().flush()
  File "/home/google_appengine/google/appengine/api/logservice/logservice.py", line 228, in flush
    self._lock_and_call(self._flush)
  File "/home/google_appengine/google/appengine/api/logservice/logservice.py", line 112, in _lock_and_call
    return method(*args)
  File "/home/google_appengine/google/appengine/api/logservice/logservice.py", line 260, in _flush
    apiproxy_stub_map.MakeSyncCall('logservice', 'Flush', request, response)
  File "/home/google_appengine/google/appengine/api/apiproxy_stub_map.py", line 94, in MakeSyncCall
    return stubmap.MakeSyncCall(service, call, request, response)
  File "/home/google_appengine/google/appengine/api/apiproxy_stub_map.py", line 308, in MakeSyncCall
    rpc.CheckSuccess()
  File "/home/google_appengine/google/appengine/api/apiproxy_rpc.py", line 156, in _WaitImpl
    self.request, self.response)
  File "/home/google_appengine/google/appengine/api/apiproxy_stub.py", line 87, in MakeSyncCall
    method(request, response)
  File "/home/google_appengine/google/appengine/api/logservice/logservice_stub.py", line 309, in _Dynamic_Flush
    new_app_logs = self.put_log_lines(group.log_line_list())
  File "/home/google_appengine/google/appengine/api/logservice/logservice_stub.py", line 321, in put_log_lines
    return _run_in_namespace(self._put_log_lines, lines)
  File "/home/google_appengine/google/appengine/api/logservice/logservice_stub.py", line 93, in _run_in_namespace
    return f(*args)
  File "/home/google_appengine/google/appengine/api/logservice/logservice_stub.py", line 330, in _put_log_lines
    message=app_log.message())
  File "/home/google_appengine/google/appengine/ext/db/__init__.py", line 945, in __init__
    prop.__set__(self, value)
  File "/home/google_appengine/google/appengine/ext/db/__init__.py", line 599, in __set__
    value = self.validate(value)
  File "/home/google_appengine/google/appengine/ext/db/__init__.py", line 2696, in validate
    value = self.data_type(value)
  File "/home/google_appengine/google/appengine/api/datastore_types.py", line 1138, in __new__
    return super(Text, cls).__new__(cls, arg, encoding)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xca in position 135: ordinal not in range(128)

2 个回答

1

这个错误的意思是,你试图把一个多字节的字符放进一个只有7位的ASCII字符串里。为了避免这个问题,建议把HTTP响应的内容当作Unicode来处理。如果你需要更具体的建议,可以把你的代码贴出来。

1

抱歉大家……是个误报 :(

问题的原因是谷歌的日志服务只接受'ascii'编码。当我在本地测试XMPP服务时,它使用日志服务来显示消息,而我发送的消息是Unicode格式的,所以就出现了错误。

解决办法是在测试时使用 str.encode('ascii', 'ignore'),或者干脆忽略这个错误。

撰写回答