由于每个问题最好只有一个问题,如果与同一项目相关的another my question的另一部分类似,请耐心等待。
情况:
我在html上有一个表单,我可以在其中设置一个数字,当它被提交时,调用views.stream_response
将值传递给 stream.py 并返回一个< em> 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)
--- --- UPDATE
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响应以留在主页/ 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}))
(将{{ris}}
添加到模板和
stream_response 函数中的resp = StreamingHttpResponse(stream_response_generator(m))
但我在模板上获得了:
<generator object streamx at 0x0000000004BEB870>
在命令行上它打印输入值,但它不再将参数传递给stream.py。
所以.. 我该如何解决这个问题?
答案 0 :(得分:2)
您可以使用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"