【问题标题】:Django HttpResponse with redirect带有重定向的 Django HttpResponse
【发布时间】:2018-08-22 10:52:13
【问题描述】:

我有一个在 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 的文件后显示该消息?

【问题讨论】:

    标签: python django httpresponse


    【解决方案1】:

    您只能为请求返回一个响应,不能在同一响应中同时重定向和返回附件(嗯,它可能在技术上是合法的 - 你必须仔细重新阅读整个 HTTP 规范要找出来——但是当客户端获得重定向状态代码时,他肯定会忽略响应正文,至少我最近看到一个浏览器到目前为止的行为不是这样),并且“附件”响应确实不会触发重新加载您访问的页面(服务器不能这样做,浏览器也不会)。

    IOW,如果您真的想要同时刷新页面和下载,您将需要至少两个视图和一些 javascript - 第一个视图创建附件并将其存储在某处,然后返回带有“成功”消息的 html 响应、到第二个视图的链接(带有对附件的引用)和一个将触发点击此链接的 js sn-p,第二个视图仅提供附件。

    【讨论】:

      【解决方案2】:

      您不一定需要重定向来显示消息,尽管您可以。

      如果您不是直接将test_data 写入响应,而是呈现包含该数据的template response,那么您还可以在该模板响应中包含成功消息。

      如果您确实想重定向,那么您需要:

      1. test_data 存储在持久的东西中——例如磁盘上的文件或数据库记录
      2. 公开一个端点以从您的持久存储中获取此数据并呈现它(以及任何 Django 消息)
      3. 使用HttpResponseRedirect 重定向到该端点

      【讨论】:

      • 是的,我不能用这种方法...有什么想法吗?
      • 啊,我没有仔细阅读这个问题。错过了整个“内容处置”部分。在这种情况下,我的建议与@brunodesthuilliers 在他的回答中建议的类似。
      猜你喜欢
      • 2016-04-22
      • 2017-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-08
      相关资源
      最近更新 更多