2009-04-26 17 views
11

Ich versuche, eine CSV-Datei von einer Aktion in meiner Webanwendung zurückzugeben und dem Benutzer eine Aufforderung zum Herunterladen der Datei oder zum Öffnen aus einer Tabellenkalkulations-App zu geben. Ich kann die CSV auf den Bildschirm spucken, aber wie ändere ich den Typ der Datei, damit der Browser erkennt, dass dies nicht als HTML angezeigt werden soll? Kann ich das csv-Modul dafür verwenden?Wie gebe ich eine CSV-Datei von einer Pylons-App zurück?

import csv 

def results_csv(self): 

    data = ['895', '898', '897'] 

    return data 

Antwort

12

den Browser sagen, die Art der Inhalte, die Sie es sind zu geben, müssen Sie den Content-type-Header auf ‚text/csv‘. In Ihrer Pylons Funktion sollte Folgendes tun den Job:

response.headers['Content-type'] = 'text/csv'

9

PAG ist richtig, aber weiterhin möchten, wenn Sie einen Namen für die heruntergeladene Datei empfehlen, auch response.headers['Content-disposition'] = 'attachment; filename=suggest.csv'

+0

Das hilft, aber die Datei hat den Namen "suggest.csv.html" Irgendeine Idee, wie das zu beheben? –

+0

mit beiden Antwortheadern (Inhaltstyp und Inhaltsdisposition) ordnungsgemäß festgelegt? Welcher Browser zeigt dieses eigenartige .html - anhängende Verhalten? –

8

einstellen Ja, Sie verwenden Sie die csv-Modul hierfür kann:

import csv 
from cStringIO import StringIO 

...

def results_csv(self): 
    response.headers['Content-Type'] = 'text/csv' 
    s = StringIO() 
    writer = csv.writer(s) 
    writer.writerow(['header', 'header', 'header']) 
    writer.writerow([123, 456, 789]) 
    return s.getvalue()