データを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変数をユニコード化しないようにするにはどうすればよいですか?または、そうなったら、元に戻すにはどうすればいいですか?
あなたは数字の文字列またはリストとしてバイトが必要ですか?受け入れられないもの -、、またはその両方? –
sergzach
@sergzach:それは何とかバイト列をユニコード文字列にデコードすることは容認できません。私は文字列ではなく生のバイトを渡しています。私は元のバイトを元のバイトではなく、ユニコード文字列にデコードして戻したい。 – Claudiu
宣言と完全なビュー関数を指定して、必要なインポートをしてください。 – sergzach