【问题标题】:Django HttpResponse - response with file and contentDjango HttpResponse - 带有文件和内容的响应
【发布时间】:2012-05-01 14:23:09
【问题描述】:

有没有简单的方法来做以下事情?

在视图中得到请求后, 向用户发回一个文件,加上重新渲染的页面模板? 类似于“合并”响应与文件和 render_to_response

这就是我用文件返回响应的方式:

filename = "/path/to/somewhere"
wrapper  = FileWrapper(open(filename))
content_type = mimetypes.guess_type(filename)[0]
response = HttpResponse(wrapper,content_type=content_type)
response['Content-Length'] = os.path.getsize(filename)
response['Content-Disposition'] = "attachment; filename=%s"%filename
return response

这就是我返回带有渲染数据的普通模板的方式:

data = getData()
return render_to_response('../templates/some_template.html', {'data': data,})

(我可能已经通过复制粘贴删除了一些重要的行,但为了说明我的观点 - 这段代码有效,问题不在于这两个代码示例)

问题是:我如何将它们“合并”在一起? 有没有一种简单的方法可以使用 django 标准功能来做到这一点? 我必须为此使用 Ajax 吗? (我不熟悉 ajax ......所以如果没有办法做到这一点,它是可取的)

谢谢,

【问题讨论】:

  • 我无法想象您希望用户在这里看到/获得什么。这将如何运作?
  • 您要求的是同一响应中的两个内容?没有简单的方法可以做到这一点。您可能应该使用 Ajax。
  • Daniel - 我在页面上有一个按钮,我希望它一次完成 2 项工作 - 将文件发送回用户,并使用新数据更新页面上的“div”部分.也许我在这里的建议(一次使用 2 个请求)不是解决方案,但欢迎任何关于如何获得正确用户体验的想法

标签: python django django-views


【解决方案1】:

如果您简化了对超文本传输​​协议的看法,那么您的用户与您的应用程序交互的方式是发送一个请求,您的应用程序对此提供响应。在4.2 of RFC 6266 部分中,当您返回与“附件”处置类型匹配的响应时,您指示用户的客户端应该“提示用户在本地保存响应,而不是正常处理它”。

不支持提供包含 HTML 和其他内容类型的响应,并且可以指示客户端保存一个并显示另一个。不支持它的事实并不意味着您不应该探索提供这种用户体验的替代方案,但它应该暗示我们没有在实践它并且用户不会期望它。

但是,抛开事实不谈,如果您真的想这样做,您需要了解提供文件和显示新的 HTML 文档将采用两个单独的请求/响应上下文。最简单的设计将包括用户将从该页面发起检索文件的请求,并订阅应用程序,以便在用户完成检索文件时收到通知,然后开始显示一些新内容或重定向到一个新页面。

【讨论】:

  • 哇,非常感谢您的回复!我认为我至少需要 2 次响应。你在django中如何实现你在第三段中所说的?
  • 基本设计是,一旦您收到对初始登录页面的请求,用户的客户端将从该请求中发起另一个下载文件的请求,您将准备并在响应中提供一个 URL登录页面,然后使用客户端 JavaScript 轮询或订阅该 URL,以识别该特定用户何时下载该特定文件,以便您可以启动重定向。这就是它的要点。
【解决方案2】:

可以使用多部分。

HttpResponse 是子类化的,可以返回多部分数据。

在客户端,您需要分块接收数据并根据适当的 Mime 类型进行解析。

这是一个实现

https://anentropic.wordpress.com/2010/05/14/jsdjango-streaming-multi-part-ajax-responses-mxhr/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-14
    • 1970-01-01
    • 2019-04-04
    相关资源
    最近更新 更多