Tri*_*rix 8 html django streaming httpresponse django-views
由于每个问题最好只有一个问题,如果与我同一项目的另一部分相似,请耐心等待.
情况:
我在html上有一个表单,我可以在其中设置一个数字,当它被提交时,调用views.stream_response将值传递给stream.py并返回StreamingHttpResponse并显示"虚拟"空白浏览器页面(/ stream_response /),其中我可以每秒钟看到一个渐进的数字m:
1
2
3
..
m
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
--- 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))
Run Code Online (Sandbox Code Playgroud)
urls.py
...
url(r'^homepage/provadata/$', views.provadata),
url(r'^stream_response/$', views.stream_response, name='stream_response'),
...
Run Code Online (Sandbox Code Playgroud)
主页/ provadata.html
<form id="numero" action="/stream_response_bis/" method="POST">
{% csrf_token %}
{{test}}
<input type="submit" value="to view" />
</form>
//{{ris}}
Run Code Online (Sandbox Code Playgroud)
我试图做一个render_to响应留在homepage/provadata.html并查看渐进列表,但stream.py没有启动,我只能看到命令行上的输入数字m.
我在views.py中尝试了这个建议
def stream_response_generator(m):
ris = stream.streamx(m)
yield loader.get_template('homepage/provadata.html').render(Context({'ris': ris}))
Run Code Online (Sandbox Code Playgroud)
(添加{{ris}}到模板,并
resp = StreamingHttpResponse(stream_response_generator(m))在stream_response功能),但我得到的模板:
<generator object streamx at 0x0000000004BEB870>
在命令行上,它打印输入值但不再将参数传递给stream.py.
那么...... 我该如何解决这个问题呢?
您可以使用 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"
Run Code Online (Sandbox Code Playgroud)