2

Django 1.5がリリースされたばかりで、StreamingHttpResponseが出荷されています。今、私はこの議論を読みまし た、そして、2番目の答えは実際にページのストリーム(実際にはただのデータ)を印刷します。

私がやりたいのは、ディスカッションのようにデータを印刷するだけでなく、ストリーム応答の出力をテンプレートに印刷することです。

私は何をすべきか?javascriptを使用して、StreamingHttpResponseを実装するビューを呼び出す必要がありますか、またはdjangoにテンプレートをレンダリングし、後でStreamingHttpResponseデータをテンプレートに送信するように指示する方法があります(データが格納されている変数を知る必要があります) ?

編集:私がこれまでに見つけた解決策は、最終的なhtmlページの断片をジェネレーター(yield)に書き込むことです。このソリューションの問題は、たとえば、データのストリーミングに伴って大きくなるバー(読み込みバーなど)を作成できないことです。

チャオ

4

1 に答える 1

7

はい。ただし、テンプレート全体が繰り返されるため、実際には必要ない場合があります。ただし、その価値については、テンプレートの再レンダリングされたコンテキストをストリーミングできます。

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)
于 2013-03-12T11:43:55.190 に答える