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;)
Bravo, c'est parti! Guillemets doubles manquants Zut! J'ai passé trop de temps à coder Python> :) – Dave