Хотите подсказать браузеру сохранить csv - PullRequest
5 голосов
/ 02 апреля 2012

Хочется предложить браузеру сохранить csv с помощью pyramid.response.Response искал подсказки и нашел здесь ссылку Django-ответ, но я не могу использовать его с Pyramid wsgi, мой код выглядит так:

from pyramid.response import Response
def get_list_names_emails(request):
    session, env = request.db, request.client_env
    response = Response(content_type='text/csv')
    output = StringIO()
    writer = csv.writer(output)
    writer.writerow(['SomeName', 'SomeEmail', 'CompanyName])
    csv_output = output.getvalue()
    return csv_output

Ответы [ 3 ]

15 голосов
/ 02 апреля 2012

В качестве более понятного способа вы можете зарегистрировать средство визуализации.

В настройках вашей конфигурации добавьте:

    config.add_renderer(name='csv',
                        factory='mypackage.renderers.CSVRenderer')

затем в 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()

После этого вы можете украсить свой вид с помощью рендерера:

@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
            }

Преимущество этого подхода заключается в лучшем тестируемом коде представления (вы просто проверяете значения словаря, не нужно ничего анализировать), и вы также можете добавить XLS или любой другой рендерер в то же представление:

@view_config(..., renderer='xls')
@view_config(..., renderer='csv')
def myview(self):
    ...
9 голосов
/ 02 апреля 2012

Попробуйте добавить Content-Disposition:

response['Content-Disposition'] = 'attachment; filename="report.csv"'
3 голосов
/ 02 апреля 2012

Лучше установить и тип контента

response['Content-type'] = 'text/csv'
response['Content-Disposition'] = 'attachment; filename="report.csv"'
...