View возвращает HttpResponse, но говорит, что возвращает None
В одном из моих представлений есть кнопка, которая запускает функцию "compileUpdate" и затем возвращает файл в качестве ответа. Ранее это работало, но теперь я получаю ошибку:
"ValueError: Представление не вернуло объект HttpResponse. Вместо этого оно вернуло None."
Блок кода ниже по существу: Получает правильную кампанию Форматирует путь к файлам для компиляции Проверяет, существует ли определенная директория, и если нет, создает ее Вызывает функцию compileUpdate Возвращает файл в виде http-ответа
Создание нерабочего файла и ответ
if req == "Bulk Update":
cmp_id = request.headers.get('cmp')
campaign = Campaign.objects.get(id=cmp_id)
parent_dir = os.path.normpath(os.getcwd() + os.sep + os.pardir)
submittedFolder = os.path.join(parent_dir, "SubmittedReviews", "", str(cmp_id) + "-" + campaign.system.name, "")
cmp_files = glob.glob(os.path.join(submittedFolder,'*'))
archive = os.path.join(parent_dir, "Archive", "", str(campaign.id) + "-" + campaign.system.name, "")
if os.path.exists(archive) == False:
os.mkdir(archive)
bulk_update = os.path.join(archive, str(campaign.id) + "-" + campaign.system.name + "_bulk_update.csv")
print(bulk_update)
with open(bulk_update, 'w') as bulk_out:
writer = csv.writer(bulk_out)
compileUpdate(cmp_files, campaign, writer)
bulk_out.close()
time.sleep(2)
file = str(bulk_update).split("/")[-1]
with open(bulk_update, 'rb') as fh:
response = HttpResponse(fh.read())
response['Content-Type'] = 'application/vnd.ms-excel'
response['Content-Disposition'] = 'inline; filename="{}"'.format(os.path.basename(bulk_update))
response['X-Accel-Redirect'] = f'/archive/{file}'
return response
Как уже упоминалось выше, эта кнопка выдает ошибку, говоря, что я возвращаю None, а не http-ответ, однако у меня есть другая кнопка в отдельном представлении, которая использует этот похожий блок кода для возврата файла, который работает просто отлично. Эта кнопка выглядит следующим образом:
Создание рабочего файла и ответ
if file_type == "responses":
data = request.GET.getlist("campaigns")[0].split(",")
campaigns = []
for item in data:
cmp_id = item.split(' ')[0]
campaigns.append(Campaign.objects.get(id=cmp_id))
files = compileResponses(campaigns)
files = joinFiles(files)
file = files[0]
f = str(file).split("/")[-1]
time.sleep(2)
with open(file, 'rb') as fh:
response = HttpResponse(fh.read())
response['Content-Type'] = 'application/vnd.ms-excel'
response['Content-Disposition'] = 'inline; filename="{}"'.format(os.path.basename(file))
response['X-Accel-Redirect'] = f'/archive/{f}'
return response
Если я вывожу первый ответ, то получаю <HttpResponse status_code=200, "application/vnd.ms-excel">
, поэтому я знаю, что на самом деле возвращаю http-ответ.
Сценарий шаблона, запускающий создание файла представления:
<script>
function exportData(event) {
var btn
btn = event.target
value = $(btn).parent().parent().parent().find('.export-select').val()
cmp = $(btn).parent().parent().parent().parent().find('td')[0].textContent
dict = {}
if (value == "Bulk Update") {
// Create the Post request, pass the csrf_token in the header of the request
$.ajax({
url: '/campaignmanager/download/' + cmp + '/',
type: 'GET',
headers: {'X-CSRFtoken': '{{ csrf_token }}', 'data': 'Bulk Update', 'cmp': cmp},
data: dict,
dataType: 'json'
});
}
else if (value == "Bulk Delete") {
// Create the Post request, pass the csrf_token in the header of the request
$.ajax({
url: '/campaignmanager/download/' + cmp + '/',
type: 'GET',
headers: {'X-CSRFtoken': '{{ csrf_token }}', 'data': 'Bulk Delete', 'cmp': cmp},
data: dict,
dataType: 'json'
})
}
else {
return false;
}
window.location = "/campaignmanager/download/" + cmp + "/"
return false;
}
</script>
Полный просмотр:
Вы ничего не вернули if req == "Bulk Delete"
Вы должны добавить HttpResponse
также
elif req == "Bulk Delete":
cmp_id = request.headers.get('cmp')
campaign = Campaign.objects.get(id=cmp_id)
return HttpResponse(status=204)