gpt4 book ai didi

html - Django:在现有的 html 页面上返回 StreamingHttpResponse

转载 作者:太空狗 更新时间:2023-10-29 13:51:54 27 4
gpt4 key购买 nike

由于每个问题最好有一个问题,如果与 another my question 的另一部分相似,请耐心等待与同一项目相关。

情况:

我有一个 html 表单,我可以在其中设置一个数字,当它被提交时,它是调用 views.stream_response它将值传递给 stream.py 并返回一个 StreamingHttpResponse 并且出现“虚拟”空白浏览器页面 (/stream_response/),我在其中每秒可以看到一个渐进数字,直到 m :

   1
2
3
..
m

流.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

我试过 THIS views.py

中的建议
def stream_response_generator(m):    
ris = stream.streamx(m)
yield loader.get_template('homepage/provadata.html').render(Context({'ris': ris}))

(将 {{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"

关于html - Django:在现有的 html 页面上返回 StreamingHttpResponse,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29964703/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com