Django:在现有的 html 页面上返回 StreamingHttpResponse
Posted
技术标签:
【中文标题】Django:在现有的 html 页面上返回 StreamingHttpResponse【英文标题】:Django: return a StreamingHttpResponse on an existing html page 【发布时间】:2015-07-09 23:26:33 【问题描述】:由于每个问题最好有一个问题,如果与同一项目相关的another my question 的另一部分相似,请耐心等待。
情况:
我在 html 上有一个表单,我可以在其中设置一个数字,提交时调用views.stream_response
将值传递给 stream.py 并返回一个 StreamingHttpResponse 和“虚拟”空白浏览器页面出现 (/stream_response/),我可以在其中看到每秒递增的数字,最高可达 m
:
1
2
3
..
m
stream.py
import time
def streamx(m):
lista = []
x=0
while len(lista) < m:
x = x + 1
time.sleep(1)
lista.append(x)
yield "<div>%s</div>\n" % x
print(lista[-1])
return (x)
---更新---
views.py
def stream_response(request):
test = InputNumeroForm()
if request.method == 'POST':
test = InputNumeroForm(data=request.POST)
if test.is_valid():
m = test.cleaned_data['numero']
print (test)
print("m = ", m)
#resp = StreamingHttpResponse(stream_response_generator(m))
resp = StreamingHttpResponse(stream.streamx(m))
return resp
return render(request, 'homepage/provadata.html','user.username': request, 'test': test, context_instance = RequestContext(request))
urls.py
...
url(r'^homepage/provadata/$', views.provadata),
url(r'^stream_response/$', views.stream_response, name='stream_response'),
...
主页/provadata.html
<form id="numero" action="/stream_response_bis/" method="POST">
% csrf_token %
test
<input type="submit" value="to view" />
</form>
//ris
我尝试做一个 render_to 响应以留在 homepage/provadata.html 上并查看渐进式列表,但 stream.py 没有启动,我只能看到在命令行输入数字m。
我在 views.py
中尝试了 THIS 建议def stream_response_generator(m):
ris = stream.streamx(m)
yield loader.get_template('homepage/provadata.html').render(Context('ris': ris))
(在 stream_response 函数中添加ris
到模板和resp = StreamingHttpResponse(stream_response_generator(m))
)
但我在模板上获得:
<generator object streamx at 0x0000000004BEB870>
并在命令行上打印输入值,但不再将参数传递给 stream.py。
那么.. 我该如何解决这个问题?
【问题讨论】:
你看过这个答案了吗:***.com/questions/2922874/… @ger.s.brett 是的,但它指向(就像在我的情况下)一个“不实际存在”的 html 页面......我不知道如何以更清晰的方式解释这一点。 如果你想使用 ajax - 为什么你需要流? 在许多答案或 cmets 中,我看到人们指的是 ajax ......所以我尝试了它,但我认为对于我的目的来说 StreamHttpResponse 是解决方案。我是编程新手,可能有很多我不知道的东西,所以我在这里寻求帮助。 你的问题解决了吗?你需要一个正确的答案吗? 【参考方案1】:您可以使用 StreamingHttpResponse 来指示您希望将结果流式传输回来,并且 django 附带的所有中间件都知道这一点,并相应地采取行动,不缓冲您的内容输出,而是直接发送。
您可以使用条件装饰器禁用 ETAG 中间件。这将使您的响应通过 HTTP 流回。您可以使用 curl 等命令行工具来确认这一点。但这可能不足以让您的浏览器在响应流式传输时显示响应。为了鼓励浏览器在响应流式传输时显示响应,您可以将一堆空白推入管道以强制其缓冲区填充。示例如下:
from django.views.decorators.http import condition
@condition(etag_func=None)
def stream_response(request):
resp = HttpResponse( stream_response_generator(), mimetype='text/html')
return resp
def stream_response_generator():
yield "<html><body>\n"
for x in range(1,11):
yield "<div>%s</div>\n" % x
yield " " * 1024 # Encourage browser to render incrementally
time.sleep(1)
yield "</body></html>\n"
【讨论】:
以上是关于Django:在现有的 html 页面上返回 StreamingHttpResponse的主要内容,如果未能解决你的问题,请参考以下文章