2011-12-08 71 views
2

我想從Twitter獲取推文,並通過GTalk使用GAE中的xmpp API發送它。我有一個很奇怪的問題。奇怪的GAE Python編碼問題

我有成功檢索到來自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) 
+0

''ascii'編解碼器無法解碼字節0xca' – Kjuly

+0

有點偏離主題:有問題與twitter和GAE afaik。 Twitter會按域進行限制 - 如果您使用的是appspot,則與其他正在與appspot上的twitter進行交談的應用程序共享有限的資源 - 我們發現很難處理這些資源。不知道它是否仍然如此。 –

+0

它們通過IP進行節制,而不是域,雖然效果是相同的:App引擎請求池在一起,並被視爲一個非常繁忙的應用程序。如果這是問題,你可能會得到一個DownloadError而不是UnicodeDecodeError。 –

回答

1

對不起球員...虛驚:(

這一問題的原因是谷歌日誌服務只接受「ASCII」編解碼器,當我在本地測試XMPP服務,它使用日誌服務以顯示消息,並且我發送的消息是Unicode,因此發生錯誤。

解決方案是在測試時使用str.encode('ascii','ignore'),或者乾脆忽略該錯誤。

1

此錯誤表示您嘗試將多字節字符存儲在7位ASCII字符串中。通過HTTP響應身體作爲unicode來避免這種情況。如果您需要更具體的建議,請發佈您的代碼。

+0

這不是「7位ASCII字符串」或「多字節字符」。這意味着他們試圖使用ASCII解碼字符串,但該字符串包含ASCII範圍之外的代碼點。 –