публикация строки дампов солений с urllib - PullRequest
0 голосов
/ 23 сентября 2011

Мне нужно отправить данные на сервер Django. Я хотел бы использовать рассол. (Нет требований безопасности -> небольшое приложение для внутренней сети.)

Сначала я собираю данные на клиенте и отправляю их с помощью urllib2

def dispatch(self, func_name, *args, **kwargs):
    dispatch_url = urljoin(self.base_url, "api/dispatch")
    pickled_args = cPickle.dumps(args, 2)
    pickled_kwargs = cPickle.dumps(kwargs, 2)
    data = urllib.urlencode({'func_name' : func_name,
                             'args' : pickled_args,
                             'kwargs': pickled_kwargs})
    resp = self.opener.open(dispatch_url, data)

Получение данных на сервере тоже работает:

def dispatch(request):
    func_name = request.POST["func_name"]
    pickled_args = request.POST["args"]
    pickled_kwargs = request.POST["kwargs"]

Но открепление вызывает ошибку:

cPickle.loads(pickled_args)

Traceback (most recent call last):
File "<string>", line 1, in <fragment>
TypeError: must be string, not unicode

Очевидно, что urllib.urlencode создал строку в юникоде. Но как я могу преобразовать его обратно, чтобы снова можно было отомкнуть (laods)?

Кстати, использование pickle в формате 0 (ascii) работает. Я могу преобразовать в строку перед распиливанием, но я бы предпочел использовать формат 2.

Также высоко ценятся рекомендации о том, как получить двоичные данные в представление Django.

1 Ответ

2 голосов
/ 23 сентября 2011

Очевидно, что urllib.urlencode создал строку Unicode.

urllib.urlencode не возвращает строку Unicode.
Это может быть особенностью используемой веб-платформычто request.POST содержит строки Unicode.

Не используйте pickle для связи между службами, это небезопасно, хрупко, непереносимо, трудно отлаживается и делает ваши компоненты слишком связанными.

...