2010-02-17 17 views
0

J'ai un contrôleur Pylons avec une action appelée sérialiser en renvoyant content_type=text/csv. Je voudrais que la réponse de l'action soit nommée basée sur le patamètre d'entrée, ie pour le chemin suivant, le fichier csv produit devrait être nommé {id}.csv: /app/PROD/serialize =>PROD.csv (ainsi un utilisateur peut ouvrir le fichier dans Excel avec un nom propre directement via un navigateur Web)Pylônes: changement de nom? Y a-t-il un meilleur moyen?

map.connect('/app/{id}/serialize',controller = 'csvproducer',action='serialize') 

J'ai essayé de définir différents en-têtes HTTP et les propriétés de l'objet de réponse du WebOb sans chance. Cependant, je me suis dit une solution en ajoutant simplement une nouvelle action au contrôleur et de rediriger dynamiquement l'action initiale à cette nouvelle action, à savoir:

map.connect('/app/{id}/serialize',controller = 'csvproducer',action='serialize') 
map.connect('/app/csv/{foo}',controller = 'csvproducer', action='tocsv') 

l'extrait du contrôleur:

def serialize(self,id): 
    try: 
    session['key'] = self.service.serialize(id) #produces csv content 
    session.save() 
    redirect_to(str("/app/csv/%s.csv" % id)) 
    except Exception,e: 
    log.error(e) 
    abort(503) 

def tocsv(self): 
    try: 
    csv = session.pop("rfa.enviornment.serialize") 
    except Exception,e: 
    log.error(e) 
    abort(503) 
    if csv: 
    response.content_type='text/csv' 
    response.status_int=200 
    response.write(csv) 
    else: 
    abort(404) 

La configuration ci-dessus fonctionne parfaitement bien, cependant, y a-t-il un meilleur/slicker/neater façon de le faire? Idéalement, je ne voudrais pas rediriger la demande; au lieu que je voudrais renommer location ou un ensemble content-disposition: attachment; filename='XXX.csv' [tenté sans succès à la fois :(]

Suis-je manque quelque chose d'évident ici

Cheers

MISE À JOUR: Merci à EBO J'ai réussi à faire le correctif content-disposition. Devrait mieux lire les spécifications du W3C la prochaine fois;)

Répondre

2

Vous devriez être en mesure de définir l'en-tête de disposition de contenu sur un response object.

Si vous avez déjà essayé cela, cela n'a peut-être pas fonctionné car la norme http stipule que les guillemets doivent être faits par des guillemets doubles.

+0

Bravo, c'est parti! Guillemets doubles manquants Zut! J'ai passé trop de temps à coder Python> :) – Dave