Возврат байтового массива python в HttpResponse - PullRequest
3 голосов
/ 16 марта 2012

У меня есть представление django, которое я хочу вернуть в файл Excel. Код ниже:

def get_template(request, spec_pk):
    spec = get_object_or_404(Spec, pk=spec_pk)

    response = HttpResponse(spec.get_template(), mimetype='application/ms-excel')
    response['Content-Disposition'] = 'attachment; filename=%s_template.xls' % spec.name
    return response

В этом примере тип spec.get_template() равен <type 'bytearray'>, который содержит двоичные данные электронной таблицы Excel.

Проблема в том, что когда я пытаюсь загрузить это представление и открыть его в Excel, оно появляется как искаженные двоичные данные. Я знаю, что bytearray правильно, хотя, если я сделаю следующее:

f = open('temp.xls', 'wb')
f.write(spec.get_template())

Я прекрасно могу открыть temp.xls в Excel.

Я даже зашел так далеко, что изменил свой взгляд на:

def get_template(request, spec_pk):
    spec = get_object_or_404(Spec, pk=spec_pk)
    f = open('/home/user/temp.xls', 'wb')
    f.write(spec.get_template())
    f.close()

    f = open('/home/user/temp.xls', 'rb')
    response = HttpResponse(f.read(), mimetype='application/ms-excel')
    response['Content-Disposition'] = 'attachment; filename=%s_template.xls' % spec.name
    return response

И это прекрасно работает - я могу открыть файл xls из браузера в Excel, и все в порядке.

Так что мой вопрос: что мне нужно сделать bytearray, прежде чем передать его HttpResponse. Почему сохранение его в двоичном виде с последующим повторным открытием работает идеально, но передача самого bytearray приводит к искаженным данным?

1 Ответ

1 голос
/ 16 марта 2012

Хорошо, с помощью совершенно случайных (и очень постоянных) проб и ошибок я нашел решение, используя модуль python binascii.

Это работает:

response = HttpResponse(binascii.a2b_qp(spec.get_template()), mimetype='application/ms-excel')

Согласно документации по питону для binascii.a2b_qp:

Преобразовать блок данных для печати в кавычки обратно в двоичные данные и вернуть двоичные данные. За один раз может быть передано более одной строки. Если необязательный аргумент header присутствует и имеет значение true, подчеркивания будут декодироваться как пробелы.

Хотелось бы, чтобы кто-нибудь сказал мне, почему сохранение его в двоичном виде с последующим открытием снова сработало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...