2011-12-23 4 views
4

일부 데이터는 장고보기에 업로드됩니다. 클라이언트 :django가 자동으로 유니 코드 POST 항목을 사용하지 못하도록합니다.

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' 

이 허용되지. 난 바이트 원시 그냥 필요합니다. 유니 코드를 업로드하지 않고 원시 바이트를 업로드하고 있습니다. 원시 바이트를 다시 원합니다. 어떻게 유니 코드로 디코드하려고하는지 모르겠다. 분명히 사용하지 않았다. utf8 원인 zlib가 데이터를 압축 해제 할 수 없었다. (그것은 zlibbing-it 전에 .encode("utf8")을하려고하지 않았을 때라도 압축을 풀 수 없습니다. 단지 시험 일뿐입니다.)

어떻게하면 django가 POST 변수를 unicodify하지 않게 할 수 있습니까? 그렇지 않으면 어떻게 취소합니까?

+0

https://docs.djangoproject.com/en/dev/ref/unicode/#useful-utility-functions 당신이 문자열이나 숫자의 목록으로 바이트가 필요하십니까? 허용되지 않는 것은 무엇입니까? , 또는 둘 다? – sergzach

+0

@sergzach : 어떻게 든 유니 코드 문자열로 바이트 문자열을 디코딩하는 것은 용납 할 수없는 일입니다. 난 원시 바이트가 아닌 문자열을 전달 해요. 원시 바이트를 유니 코드 문자열로 디코딩하지 않고 원래 바이트로 되 돌린다. – Claudiu

+0

선언과 함께 전체보기 기능을 지정할 수 있으며 필요한 가져 오기를 수행 할 수 있습니까? – sergzach

답변

0

이 작업을 실행 취소 할 수 있습니다.

한번에 사용하기 * smart_str *을 django.utils.encoding 에서 :

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

여기에 문서를하십시오보기

:

+0

아니요, 내 데이터를 읽을 수있는 형식으로 만들고 싶지 않습니다. 데이터를 업로드하고 싶습니다 ._ 원시 형식입니다. 바이트. 한쪽 끝에서 원시 바이트를 업로드하고 다른 쪽에서는 유니 코드를 얻습니다. 그 그림에 뭔가 이상이 있습니다. – Claudiu

+0

답변을 변경했습니다. – sergzach

관련 문제