Могу ли я отправить сжатые данные 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 2

1 ответ:

Используйте self.write_message(compressed_data, binary=True) для отправки двоичного сообщения. Вам также потребуется изменить клиентскую часть приложения, чтобы распаковать его.

Обратите внимание, что двоичные данные могут быть трудны для работы в javascript, поэтому вы можете использовать расширение сжатия websocket вместо сжатия данных самостоятельно (это заставит Tornado сжимать данные автоматически, а браузер будет распаковывать их).

Чтобы включить это, переопределите get_compression_options() в вашем подклассе WebSocketHandler:

def get_compression_options(self):
    return {}

An пустой дикт использует значения по умолчанию, или вы можете вернуть параметры, такие как {'compression_level': 9}. При использовании этого режима вы просто напишете свое сообщение, как обычно, вместо того, чтобы сжимать его.