Могу ли я отправить сжатые данные gzip через tornado websocket на Python?
Я хотел бы отправить сжатые данные gzip с сервера tornado на javascript-клиент. Вот мой код.
buf = StringIO()
gfile = gzip.GzipFile(mode='wb', fileobj=buf)
try:
gfile.write( "hello world" )
finally:
gfile.close()
compressed_data = buf.getvalue()
self.write_message( compressed_data )
Серверная сторона не выдает ошибок. Но chrome выдает ошибку "не удалось декодировать текстовый фрейм как UTF8".
Есть ли здесь обходной путь?
1 ответ:
Используйте
Обратите внимание, что двоичные данные могут быть трудны для работы в javascript, поэтому вы можете использовать расширение сжатия websocket вместо сжатия данных самостоятельно (это заставит Tornado сжимать данные автоматически, а браузер будет распаковывать их).self.write_message(compressed_data, binary=True)
для отправки двоичного сообщения. Вам также потребуется изменить клиентскую часть приложения, чтобы распаковать его.Чтобы включить это, переопределите
get_compression_options()
в вашем подклассеWebSocketHandler
:def get_compression_options(self): return {}
An пустой дикт использует значения по умолчанию, или вы можете вернуть параметры, такие как
{'compression_level': 9}
. При использовании этого режима вы просто напишете свое сообщение, как обычно, вместо того, чтобы сжимать его.