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)
Вернуться на верх