1

有没有一种简单的方法来执行以下操作?

在视图中获取请求后,向用户发送一个文件,以及重新渲染的页面模板?类似于“合并”响应与文件和 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 ......所以如果有办法在没有的情况下做到这一点,那就更好了)

谢谢,

4

2 回答 2

4

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

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

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

于 2012-05-01T15:09:14.727 回答
0

可以使用多部分。

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

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

这是一个实现

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

于 2014-12-25T15:33:59.930 回答