2012-04-02 7 views
5

Wollen Browser aufzufordern csv speichern mit pyramid.response.Response nach Hinweisen gesucht und gefunden hier a link Antwort Django, aber ich kann es nicht verwenden, mit Pyramid meinen Code wsgi wie folgt aussieht:Wollen Browser aufzufordern csv speichern

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 

Antwort

9

Versuchen das Hinzufügen Content-Disposition:

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

++ HTTP 101 FTW –

3

Es ist besser, Inhaltstyp zu setzen, wie gut

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

Ist es nicht, was OPs Code bereits tut in response = Response (content_type = 'text/csv')? – BluesRockAddict

+0

Mine hat ohne das nicht funktioniert. Es würde einen Download-Dialog mit allen meinen Informationen anzeigen, aber ich würde sagen, dass ich eine HTML-Datei heruntergeladen habe. –

15

Um dies zu verbessern, können Sie einen Renderer registrieren.

In Ihrer Konfiguration Set-up, fügen:

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

dann in 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() 

Danach werden Sie die Ansicht mit dem Renderer dekorieren:

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

Der Vorteil dieses Ansatzes ist ein besser überprüfbarer Ansichtscode (Sie suchen nur nach dem Wörterbuchwert s, keine Notwendigkeit, etwas) zu analysieren und Sie können auch eine XLS oder was auch immer Renderer zu derselben Ansicht hinzufügen:

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

+1 für die Testbarkeit! –

Verwandte Themen