Come modo più semplice per farlo, è possibile registrare un riproduttore.
Nella configurazione di set-up, aggiungere:
config.add_renderer(name='csv',
factory='mypackage.renderers.CSVRenderer')
poi nel 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()
Dopo di che, si può decorare la tua vista con il renderer:
@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
}
Il vantaggio di questo approccio è il codice di visualizzazione testabile migliore (basta controllare il valore del dizionario s, non c'è bisogno di analizzare nulla) e si può anche aggiungere un XLS o qualsiasi altra cosa renderer per la stessa vista:
@view_config(..., renderer='xls')
@view_config(..., renderer='csv')
def myview(self):
...
fonte
2012-04-02 18:29:34
++ HTTP 101 FTW –