2012-04-02 13 views
5

desidera richiedere browser di salvare CSV utilizzando pyramid.response.Response cercato indizi e trovato qui c'è a link Django risposta, ma non posso usarlo con la piramide WSGI il mio codice è simile al seguente:desidera richiedere browser di salvare 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 

risposta

9

Prova ad aggiungere Content-Disposition:

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

++ HTTP 101 FTW –

3

E 'meglio impostare il tipo di contenuto, nonché

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

Non è forse quello del codice OP già fa in risposta = Response (content_type = 'text/csv')? – BluesRockAddict

+0

Il mio non ha funzionato senza questo. Mostrerebbe una finestra di dialogo di download con tutte le mie informazioni, ma dire che stavo scaricando un file HTML. –

15

Come modo più semplice per farlo, è possibile registrare un riproduttore.

Nella configurazione di set-up, aggiungere:

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

poi nel 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() 

Dopo di che, si può decorare la tua vista con il renderer:

@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 
      } 

Il vantaggio di questo approccio è il codice di visualizzazione testabile migliore (basta controllare il valore del dizionario s, non c'è bisogno di analizzare nulla) e si può anche aggiungere un XLS o qualsiasi altra cosa renderer per la stessa vista:

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

+1 per testabilità! –

Problemi correlati