2011-12-23 15 views
4

データをDjangoビューにアップロードします。クライアント:djangoが自動的にunicodifing POSTのstuffから停止する

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がデータを解凍できませんでした。 (これはzlibbing-itの前に.encode("utf8")を実行しようとしなかったときでも解凍できませんでした。)

djangoでPOST変数をユニコード化しないようにするにはどうすればよいですか?または、そうなったら、元に戻すにはどうすればいいですか?

+0

あなたは数字の文字列またはリストとしてバイトが必要ですか?受け入れられないもの - 、またはその両方? – sergzach

+0

@sergzach:それは何とかバイト列をユニコード文字列にデコードすることは容認できません。私は文字列ではなく生のバイトを渡しています。私は元のバイトを元のバイトではなく、ユニコード文字列にデコードして戻したい。 – Claudiu

+0

宣言と完全なビュー関数を指定して、必要なインポートをしてください。 – sergzach

答えて

0

これを元に戻すことができます。をdjango.utils.encoding から* smart_str使用する

てみてください*:

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

+0

いいえ、データを読みやすい形式にしたくありません - データをアップロードしたいです_バイト。私は一方の端から生のバイトをアップロードし、他方の端でユニコードを取得します。その写真に何か問題があります。 – Claudiu

+0

私は自分の答えを変えました。 – sergzach

関連する問題