2015-03-31 3 views
0

Я пытаюсь ставить задачи для Python RQ с помощью JavaScript. Для этого я просто контролировал, что RQ делает с Redis. В частности, он хранит маринованный список, указывающий, где найти задачу для запуска, включая входные аргументы и т. Д. Здесь я использую пример, найденный на домашней странице RQ. При хранении следующей строки (маринованный список):Python RQ queueing with JavaScript

'\x80\x02(X\x1c\x00\x00\x00my_module.count_words_at_urlq\x01NU\x0fhttp://nvie.comq\x02\x85q\x03}q\x04tq\x05.' 

с JavaScript, он делает что-то странное с литералами \x80 и \x85. Он заменяет их \xc2\x80 и \xc2\x85, и я не могу понять, почему и как остановить это поведение. Остальная часть строки попадает в Redis, как и ожидалось. Дополнительный литерал препятствует правильному функционированию rqworker, более конкретно рассолнечному.

> encodeURI('\x80\x02(X\x1c\x00\x00\x00my_module.count_words_at_urlq\x01NU\x0fhttp://nvie.comq\x02\x85q\x03}q\x04tq\x05.') 
'%C2%80%02(X%1C%00%00%00my_module.count_words_at_urlq%01NU%0Fhttp://nvie.comq%02%C2%85q%03%7Dq%04tq%05.' 

> decodeURI('\x80\x02(X\x1c\x00\x00\x00my_module.count_words_at_urlq\x01NU\x0fhttp://nvie.comq\x02\x85q\x03}q\x04tq\x05.') 
' \u0002(X\u001c\u0000\u0000\u0000my_module.count_words_at_urlq\u0001NU\u000fhttp://nvie.comq \u0002q\u0003}q\u0004tq\u0005.' 

Я использую node и node_redis.

ответ

0

Обнаружил это самостоятельно. Выводная строка Python's pickle на самом деле является двоичной, что является обычным способом записи и чтения файлов в Python. Javascript не нравится и «исправляет» его. Решение - это буфер Javascript.

> new Buffer('\x80\x85', 'binary') 
<Buffer 80 85> 

тогда

> new Buffer('\x80\x85') 
<Buffer c2 80 c2 85> 

Просто подача node_redis объект буфера, «правильное» представление сериализованного объекта появится в Redis и rqworker работает, как ожидалось. Имейте в виду, что «двоичный» режим находится в процессе устаревания.

Смежные вопросы