Nếu tập tin là tĩnh (nghĩa là không được tạo ra đặc biệt cho yêu cầu này), bạn không nên phục vụ nó thông qua django anyway. Bạn nên cấu hình một số đường dẫn (như/static /) để được phục vụ bởi máy chủ web của bạn, và lưu tất cả các chi phí django.
Nếu tập tin là động, có 2 lựa chọn:
- Tạo nó trong bộ nhớ và phục vụ nó từ django.
- Tạo nó trên đĩa và trả lại một HttpResponseRedirect cho nó, sao cho máy chủ web của bạn giao dịch với bản tải xuống (nếu tệp quá lớn, bạn nên sử dụng tùy chọn này).
Đối với phục vụ nó tự động, tôi đã sử dụng đoạn mã sau (mà là một phiên bản đơn giản của ExcelResponse)
import StringIO
from django.db.models.query import ValuesQuerySet, QuerySet
class CSVResponse(HttpResponse):
def __init__(self, data, output_name='data', headers=None, encoding='utf8'):
# Make sure we've got the right type of data to work with
valid_data = False
if isinstance(data, ValuesQuerySet):
data = list(data)
elif isinstance(data, QuerySet):
data = list(data.values())
if hasattr(data, '__getitem__'):
if isinstance(data[0], dict):
if headers is None:
headers = data[0].keys()
data = [[row[col] for col in headers] for row in data]
data.insert(0, headers)
if hasattr(data[0], '__getitem__'):
valid_data = True
assert valid_data is True, "CSVResponse requires a sequence of sequences"
output = StringIO.StringIO()
for row in data:
out_row = []
for value in row:
if not isinstance(value, basestring):
value = unicode(value)
value = value.encode(encoding)
out_row.append(value.replace('"', '""'))
output.write('"%s"\n' %
'","'.join(out_row))
mimetype = 'text/csv'
file_ext = 'csv'
output.seek(0)
super(CSVResponse, self).__init__(content=output.getvalue(),
mimetype=mimetype)
self['Content-Disposition'] = 'attachment;filename="%s.%s"' % \
(output_name.replace('"', '\"'), file_ext)
Để sử dụng nó, chỉ cần sử dụng trở lại CSVResponse (...) đi qua trong danh sách các danh sách, một danh sách các dicts (có cùng các khóa), một QuerySet, một ValuesQuerySet
Nguồn
2010-03-17 21:36:03
đã dùng thử, vẫn không hoạt động. Tôi có thể thấy phản hồi và tiêu đề trong FireBug nhưng tôi không nhận được hộp thoại. – spyder
Thử chỉnh sửa hiện tại của tôi. – Cerin
Tôi đã thử nhưng không hoạt động. Xin vui lòng xem trả lời của tôi, tôi phát hiện ra vấn đề không có gì để làm với django. Cảm ơn – spyder