Si el archivo es estática (es decir, no genera específicamente para esta solicitud) que no debería estar sirviendo a través de Django de todos modos. Debería configurar alguna ruta (como/static /) para que sea servida por su servidor web, y guardar toda la sobrecarga de django.
Si el archivo es dinámica, hay 2 opciones:
- crearlo en la memoria y se sirve de Django.
- Créelo en el disco y devuélvalo HttpResponseRedirect para que su servidor web se encargue de la descarga (si el archivo es muy grande, debe usar esta opción).
En cuanto a servir de forma dinámica, He estado usando el siguiente código (que es una versión simplificada de 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)
Para usarlo, sólo tiene que utilizar CSVResponse retorno (...) hacer pasar en una lista de listas, una lista de dicts (con las mismas claves), un QuerySet, un ValuesQuerySet
lo probé, todavía no funciona. Puedo ver la respuesta y los encabezados en FireBug pero no obtengo un cuadro de diálogo. – spyder
Prueba mi edición actual. – Cerin
Lo intenté pero no funcionó. Por favor, mira mi respuesta, descubrí que el problema no tiene nada que ver con django. Gracias – spyder