2012-04-02 10 views
5

desea solicitar navegador para guardar CSV usando pyramid.response.Response buscaba pistas y se encontró aquí está a link Django respuesta, pero no puedo usarlo con la pirámide wsgi mi código es el siguiente:desea solicitar navegador para guardar csv

from pyramid.response import Response 
def get_list_names_emails(request): 
    session, env = request.db, request.client_env 
    response = Response(content_type='text/csv') 
    output = StringIO() 
    writer = csv.writer(output) 
    writer.writerow(['SomeName', 'SomeEmail', 'CompanyName]) 
    csv_output = output.getvalue() 
    return csv_output 

Respuesta

9

Trate de añadir Content-Disposition:

response['Content-Disposition'] = 'attachment; filename="report.csv"' 
+0

++ HTTP 101 FTW –

3

es mejor establecer el tipo de contenido, así

response['Content-type'] = 'text/csv' 
response['Content-Disposition'] = 'attachment; filename="report.csv"' 
+0

No es lo del código OP ya lo hace en respuesta = respuesta (content_type = 'text/csv')? – BluesRockAddict

+0

El mío no funcionó sin esto. Mostraría un diálogo de descarga con toda mi información, pero diría que estaba descargando un archivo HTML. –

15

Como una forma más limpia de hacerlo, puede registrar un procesador.

En la configuración de su puesta en marcha, añadir:

config.add_renderer(name='csv', 
         factory='mypackage.renderers.CSVRenderer') 

después en mypackage/renderers.py:

class CSVRenderer(object): 
    def __init__(self, info): 
     pass 

    def __call__(self, value, system): 
     fout = StringIO.StringIO() 
     writer = csv.writer(fout, delimiter=';', quoting=csv.QUOTE_ALL) 

     writer.writerow(value['header']) 
     writer.writerows(value['rows']) 

     resp = system['request'].response 
     resp.content_type = 'text/csv' 
     resp.content_disposition = 'attachment;filename="report.csv"' 
     return fout.getvalue() 

Después de eso, se puede decorar su vista con el procesador:

@view_config(..., renderer='csv') 
def myview(self): 
    header = ['name', 'surname', 'address'] 

    rows = [ 
      (
       row['name'], 
       row['surname'], 
       row['address'], 
      ) 
     for row in query_rows(.....) 
     ] 

    return { 
      'header': header, 
      'rows': rows 
      } 

La ventaja de este enfoque es un mejor código de vista comprobable (solo verifica el valor del diccionario) s, no hay necesidad de analizar cualquier cosa) y también se puede añadir un XLS o lo que sea Traducir al mismo punto de vista:

@view_config(..., renderer='xls') 
@view_config(..., renderer='csv') 
def myview(self): 
    ... 
+0

+1 para probar! –

Cuestiones relacionadas