Странная проблема кодировки GAE Python - PullRequest
2 голосов
/ 08 декабря 2011

Я пытаюсь получить твиты из Twitter и отправить их через GTalk с помощью API xmpp в GAE. У меня очень странная проблема.

Я успешно получил данные из Twitter. Ошибка возникает, когда я отправляю их с помощью API-интерфейса XMPP. Согласно информации трассировки, ошибка произошла в коде 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 голос
/ 09 декабря 2011

Извините, ребята ... ложная тревога: (

Причиной проблемы является то, что служба регистрации Google принимает только кодек 'ascii' , и при тестировании службы XMPP налокальный, он использует службу журналирования для отображения сообщения, а отправляемое мной сообщение в Unicode, поэтому возникает ошибка.

Решение состоит в том, чтобы использовать str.encode ('ascii', 'ignore'), в то время кактестирование или просто игнорировать эту ошибку.

1 голос
/ 08 декабря 2011

Эта ошибка означает, что вы пытались сохранить многобайтовый символ в 7-битной строке ASCII. Передавайте тело ответа HTTP как Unicode, чтобы избежать этого. Если вам нужен более конкретный совет, оставьте свой код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...