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>

完整视图

def campaignManager(request, **kwargs):

elevated = checkPerms(request)
sysAdmin = checkAdmin(request)
if not request.user.is_authenticated:
return HttpResponseRedirect('/login')
elif elevated != True and sysAdmin != True and request.user.is_superuser == False:
return HttpResponseRedirect('/login')

if "download" in str(request.path):
req = request.headers.get('data')
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()
with open(bulk_update, 'r') as bulk:
reader = csv.DictReader(bulk)
for row in reader:
print(row)
bulk.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


elif req == "Bulk Delete":
cmp_id = request.headers.get('cmp')
campaign = Campaign.objects.get(id=cmp_id)
pass
else:
# Uses campaign manager template
template = loader.get_template('AccessReview/campaignManager.html')
# Create empty dict for context
context = {}
context['user'] = employee.objects.get(pid__iexact=request.user.username)
if sysAdmin == True:
context["parent_template"] = "AccessReview/sysAdminBase.html"
elif request.user.is_superuser == True:
context["parent_template"] = "AccessReview/adminbase.html"
elif elevated == True:
context["parent_template"] = "AccessReview/elevatedBase.html"
# Pass campaign and review instances to campaign management template
context['Campaigns'] = Campaign.objects.all()
context['Reviews'] = review.objects.all()
context['Systems'] = System.objects.all()


# Handle campaign creations through POST request
if request.method == "POST":
data = request.POST
req = request.headers.get('data')
if req == "campaign":
allowed = checkPerms(request)
if allowed == True:
date = str(data['expectedEndDate']).split("/")[2] + "-" + str(data['expectedEndDate']).split("/")[0] + "-" + str(data['expectedEndDate']).split("/")[1]
systemName = data['system']
reviewLevel = data['reviewLevel']
# Create campaign with the one required value
campaign = Campaign.createCampaign(expectedEndDate=date, system=systemName, reviewLevel=reviewLevel)

management.debug("%s created a campaign for %s expected to be completed by %s", request.user, systemName, date)
time.sleep(1)
return redirect('/campaignmanager/')
else:
return redirect('/campaignmanager/')
return HttpResponse(template.render(context, request))

您没有返回任何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)

最新更新