【发布时间】:2011-12-08 14:36:33
【问题描述】:
我正在尝试从 Twitter 获取推文并使用 GAE 中的 xmpp API 通过 GTalk 发送。我遇到了一个非常奇怪的问题。
我已成功从 Twitter 检索数据。当我使用 XMPP API 发送它们时会发生错误。根据跟踪信息,错误发生在 GAE 代码中,而不是我自己的。我用Python2.5测试了具体的tweet,它能够正确处理tweet文本,并且该tweet只包含英文字符。
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)
【问题讨论】:
-
'ascii' codec can't decode byte 0xca -
稍微偏离主题:twitter 和 GAE afaik 存在问题。 Twitter 确实会按域进行限制——如果你在 apppot 之外运行,那么你正在与在 apppot 上与 twitter 对话的其他应用共享有限的资源——我们发现它很难使用。不确定是否仍然如此。
-
它们通过 IP 而不是域进行节流,尽管效果是一样的:App Engine 请求汇集在一起,并被视为一个非常繁忙的应用程序。如果这是问题所在,您可能会收到 DownloadError 而不是 UnicodeDecodeError。
-
我的错误 - 道歉 - 并没有表明它是错误的根源,只是强调在 GAE 上实现 twitter 应用程序存在问题。
-
根据堆栈跟踪,在我看来您正在发出包含非 ASCII 编码字符的请求;写入日志条目时,数据库会引发异常。随机想法:您是否正在添加一个具有未编码路径的任务?还是您在 dev_appserver 上使用 XMPP 模拟器来 POST 未编码的数据?
标签: python google-app-engine character-encoding