2013-02-27 62 views
0

Django 1.5剛剛問世,它發佈了StreamingHttpResponse。 現在,我讀this discussion和第二個答案實際上打印出一個頁面中的流(實際上只是數據)。Django StreamingHttpResponse進入模板

我想要做的是將流響應的輸出打印到模板中,而不僅僅是打印數據,如the discussion

我該怎麼辦?是否必須使用javascript並調用實現StreamingHttpResponse的視圖,或者有一種方法可以告訴django呈現模板,然後將StreamingHttpResponse數據發送到模板(然後我需要知道數據存儲的變量是什麼) ?

編輯:到目前爲止我發現的解決方案是將最後一頁的HTML頁面寫入生成器(yield)。這個解決方案的問題是,例如,我不能有一個隨着數據流而增長的酒吧(如加載欄)。

回答

2

是的,但它可能不是你真正想要的,因爲整個模板會被重複。但是,對於它的價值,您可以爲模板傳輸重新呈現的上下文。

from django.http import StreamingHttpResponse 
from django.template import Context, Template 

# Template code parsed once upon creation, so 
#  create in module scope for better performance 

t = Template('{{ mydata }} <br />\n') 

def gen_rendered(): 
    for x in range(1,11): 
     c = Context({'mydata': x}) 
     yield t.render(c) 

def stream_view(request): 
    response = StreamingHttpResponse(gen_rendered()) 
    return response 

編輯: 您也可以渲染模板,只是追加<p><tr>標籤給它,但它是出乎模板擺在首位的目的。 (即從代碼中分離出來)

from django.template import loader, Context 
from django.http import StreamingHttpResponse 

t = loader.get_template('admin/base_site.html') # or whatever 
buffer = ' ' * 1024 

def gen_rendered(): 
    yield t.render(Context({'varname': 'some value', 'buffer': buffer})) 
    #             ^^^^^^ 
    # embed that {{ buffer }} somewhere in your template 
    #  (unless it's already long enough) to force display 

    for x in range(1,11): 
     yield '<p>x = {}</p>{}\n'.format(x, buffer) 
+0

好的,我已經在這一點上了。據我的理解,從這個答案和Django的Google網上論壇主題[https://groups.google.com/d/msg/django-users/eQ2SVB_uYuE/IayaI0YlPngJ]和回覆中,我不想做的事情通過這種方式。 感謝您的幫助 – EsseTi 2013-03-13 12:13:42

+0

我不確定_shouldn't_。如果您有一個小型項目,您可以控制演示文稿和邏輯,這似乎可以接受。我回答是因爲我正在實施它。請注意,即使關閉瀏覽器頁面,邏輯(我的是批量添加)仍會繼續運行。 – Frank 2013-03-13 18:18:02