остановить django от автоматического unicodifing POST вещи - PullRequest
4 голосов
/ 24 декабря 2011

Я загружаю некоторые данные в представление Django.Клиент:

from poster.encode import multipart_encode

def upload_data(upload_url, data, filename):
    print "Uploading %d bytes to server, file=%s..." % (len(data), filename)

    datagen, headers = multipart_encode({filename: data})

    request = urllib2.Request(upload_url, datagen, headers)
    # Actually do the request, and get the response
    try:
        resp_f = urllib2.urlopen(request, timeout=120)
    except urllib2.URLError:
        return None

    res = resp_f.read()
    resp_f.close()
    return res

#...

def foo(self, event_dicts_td):
    event_dicts_td_json = json.dumps(event_dicts_td)
    res = upload_data(self.upload_url, event_dicts_td_json.encode('utf8').encode('zlib'), "event_dicts_td.json.gz")

Представление:

def my_view(request):
    event_dicts_td_json_gz = request.POST.get('event_dicts_td.json.gz')
    if not event_dicts_td_json_gz:
        return HttpResponse("fail")

    print type(event_dicts_td_json_gz), repr(event_dicts_td_json_gz[:10])
    event_dicts_td_json_gz = event_dicts_td_json_gz.encode("utf8")
    print type(event_dicts_td_json_gz), repr(event_dicts_td_json_gz[:10])

    event_dicts_td_json = event_dicts_td_json_gz.decode("zlib").decode("utf8")

    return HttpResponse("it still failed")

Вывод:

<type 'unicode'> u'x\ufffd\ufffd]s\ufffd\u0192\ufffd\ufffd\n'
<type 'str'> 'x\xef\xbf\xbd\xef\xbf\xbd]s\xef'

Это недопустимо.Мне просто нужны необработанные байты.Я не загружаю Unicode - я загружаю необработанные байты - и я хочу вернуть эти необработанные байты.Я не знаю, как он пытается декодировать его в юникод - очевидно, не используя utf8, потому что zlib не смог распаковать данные.(Он не смог распаковать его, даже когда я не пытался сделать .encode("utf8") перед zlibbing-it, это был просто тест.)

Как мне заставить django не unicodify переменных POST?Или, если это произойдет, как я могу отменить это?

1 Ответ

0 голосов
/ 24 декабря 2011

Вы можете отменить это.

Попробуйте использовать * smart_str * из django.utils.encoding :

from django.utils.encoding import smart_str    
event_dicts_td_json_gz = smart_str( event_dicts_td_json_gz )

Пожалуйста, просмотрите документы здесь: https://docs.djangoproject.com/en/dev/ref/unicode/#useful-utility-functions

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