отправить данные в виде файла с aiohttp

У меня есть такая конечная точка, которая возвращает файл с csv:

# POST /export/
@asyncio.coroutine
def export(request):
    post = yield from request.post()
    if not post.get('passwd', None) == 'topsecret':
        return web.Response(status=403)

    csv = data.encode()
    resp = web.StreamResponse(headers=aiohttp.MultiDict({
        'CONTENT-DISPOSITION': 'attachment; filename="%d.csv"' % int(time.time())}))
    resp.content_type = 'text/csv'
    resp.content_length = len(csv)
    yield from resp.prepare(request)

    resp.write(csv)

    return resp

Мой вопрос следующий: можно ли как-то автоматически устанавливать заголовки? Как сказано в документации, у aiohttp есть BodyPartWriter класса, который имеет set_content_disposition метода. Но, насколько я понял, его можно было использовать только с клиентским API (по крайней мере, есть только примеры для клиентского API). Итак, можно ли использовать BodyPartWriter с объектами Response?


person Michael Ihnatenko    schedule 04.12.2015    source источник


Ответы (1)


BodyPartWriter & BodyPartReader API предназначены только для чтения или записи частей multipart, закодированных запрос/ответ на стороне клиента (следовательно, они находятся в модуле multipart).

Отправка составного ответа на стороне сервера не имеет смысла.

В вашем случае вы возвращаете ответ, предоставляя content-disposition в качестве подсказки браузеру о том, как назвать файл. На данный момент не существует автоматического способа отправки файла, который также заполнял бы соответствующие заголовки.

person Jashandeep Sohi    schedule 05.12.2015