2012-04-02 16 views
5

Chcesz poprosi przeglądarkę, aby zapisać plik CSV przy użyciu pyramid.response.Response szukał wskazówek i znalazł oto a link Django odpowiedź, ale nie można go używać z Pyramid WSGI mój kod wygląda następująco:Chcesz poprosi przeglądarkę, aby zapisać 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 

Odpowiedz

9

spróbuj dodać Content-Disposition:

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

++ HTTP 101 FTW –

3

lepiej ustawić typ zawartości oraz

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

Czy nie jest to co OP kod już robi w odpowiedzi = Response (content_type = "text/csv")? – BluesRockAddict

+0

Mój nie działał bez tego. Zostanie wyświetlone okno dialogowe pobierania z wszystkimi moimi informacjami, ale powiedz, że pobierałem plik HTML. –

15

Jako bardziej przejrzysty sposób można zarejestrować renderer.

w konfiguracji set-up, dodać:

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

następnie w 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() 

Po tym, można ozdobić swój pogląd z renderujący:

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

Zaletą tego podejścia jest lepszy testowalny kod widoku (wystarczy sprawdzić wartość słownika s, bez potrzeby analizowania czegokolwiek), można także dodać XLS lub cokolwiek renderujący do tego samego widoku:

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

+1 za testowalność! –

Powiązane problemy