带有重定向的Django HttpResponse

时间:2018-08-22 10:52:13

标签: python django httpresponse

我有一个功能,可以在Django中下载Excel文件:

 x= Y.objects.filter(pk__in=ids)
 response = HttpResponse(content_type='application/vnd.ms-excel')
 response['Content-Disposition'] = 'attachment; filename=Test.xlsx'
 test_data= WriteFile(x)
 response.write(test_data)
 return response

我的目标是在此之后显示一条消息:

messages.success(request, 'Success!')

但是我需要在return response之后重定向,因为如果没有,则该消息不会出现,只有在我手动刷新页面时才会出现。

使用return response下载文件后,如何使消息显示的任何想法?

2 个答案:

答案 0 :(得分:0)

您只能为一个请求返回一个响应,不能同时重定向和返回同一响应中的附件(可能在技术上是合法的-您必须仔细阅读整个HTTP规范以了解-,但是客户端在获得重定向状态代码时肯定会忽略响应正文,至少到目前为止,至少我较新地看到浏览器以其他方式运行),并且“附件”响应确实不会触发重新加载您要访问的页面(服务器无法执行此操作,浏览器也无法执行)。

IOW,如果您真的要刷新页面并下载文件,则至少需要两个视图和一些javascript-第一个视图创建附件并将其存储在某个位置,然后返回带有“成功”消息的html响应,指向第二个视图的链接(带有对附件的引用)以及将触发对此链接的点击的js代码段,第二个视图仅用于附件。

答案 1 :(得分:-1)

您可以不必显示 redirect 来显示消息,

如果不是要直接将test_data写入响应,而是要渲染一个包含数据的template response,那么还可以在模板响应中包含成功消息。

如果您确实要重定向,则需要:

  1. test_data存储在持久的内容中,例如磁盘上的文件或数据库记录
  2. 暴露端点以从持久性存储中获取此数据并进行渲染(以及所有Django消息)
  3. 使用HttpResponseRedirect重定向到该端点