12👍
✅
Add the UTF-8 BOM to the response object before you write your data:
def render_to_csv(self, request, qs):
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename="test.csv"'
# BOM
response.write("\xEF\xBB\xBF")
writer = csv.writer(response, delimiter=',')
…
3👍
StreamingHttpResponse
for csv
add UTF-8 BOM or \xEF\xBB\xBF
Modified from official documents
import csv
import codecs
from django.utils.six.moves import range
from django.http import StreamingHttpResponse
class Echo(object):
def write(self, value):
return value
def iter_csv(rows, pseudo_buffer):
yield pseudo_buffer.write(codecs.BOM_UTF8)
writer = csv.writer(pseudo_buffer)
for row in rows:
yield writer.writerow(row)
def some_streaming_csv_view(request):
rows = (["Row {}".format(idx), str(idx)] for idx in range(65536))
response = StreamingHttpResponse(iter_csv(rows), Echo()), content_type="text/csv")
return response
2👍
The given answers are great but I want to give a hint how to make the official examples from the Django
docs work with the UTF-8 BOM sequence of bytes at the start of the stream by only changing one line:
import itertools
import codecs
streaming_content = itertools.chain([codecs.BOM_UTF8], (writer.writerow(row) for row in rows))
response = StreamingHttpResponse(streaming_content, content_type="text/csv")
- Docker [Errno 111] Connect call failed ('127.0.0.1', 6379)
- ImportError: cannot import name "urandom"
-1👍
In my case, somehow the first BOM_UTF8 character is auto removed when returned as http response. So I had to manually add TWO BOM_UTF8 characters.
response.write(codecs.BOM_UTF8)
response.write(codecs.BOM_UTF8)
response.write(encoded_csv_content)
I don’t know the cause of this, but maybe it will help someone, or someone who knows why may explain in the comment.
- Django binary (no source code) deployment
- How can I use AWS's Dynamo Db with Django?
- Can't pickle <type 'function'>: attribute lookup __builtin__.function failed
Source:stackexchange.com