2009-04-26 7 views
11

J'essaie de renvoyer un fichier CSV à partir d'une action dans ma webapp, et de demander à l'utilisateur de télécharger le fichier ou de l'ouvrir à partir d'une application de tableur. Je peux obtenir le CSV cracher dehors sur l'écran, mais comment je change le type du dossier de sorte que le navigateur identifie que ce n'est pas censé être affiché comme HTML? Puis-je utiliser le module csv pour cela?Comment renvoyer un fichier CSV à partir d'une application Pylons?

import csv 

def results_csv(self): 

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

    return data 

Répondre

12

Pour indiquer au navigateur le type de contenu que vous donnez, vous devez définir l'en-tête Content-type à 'text/csv. Dans votre fonction Pylônes, ce qui suit devrait faire le travail:

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

9

PAG est correct, mais en plus si vous voulez suggérer un nom pour le fichier téléchargé, vous pouvez également définir response.headers['Content-disposition'] = 'attachment; filename=suggest.csv'

+0

Cela aide, mais le fichier a le nom "suggest.csv.html" Une idée de comment résoudre ce problème? –

+0

avec les deux en-têtes de réponse (type de contenu et disposition de contenu) défini correctement? Quel navigateur présente ce comportement html particulier? –

8

Oui, vous peut utiliser le module csv pour cela:

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() 
Questions connexes