【问题标题】:django - views generators insteat of functionsdjango - 查看生成器而不是函数
【发布时间】:2015-06-20 22:18:31
【问题描述】:

在 django 中,是否可以创建生成器而不是函数。

现在我的view.py 中有这个功能

def first_case(request):
    data = [[1,2],[4,7]]
    template = loader.get_template('usecases/index.html')
    context = RequestContext(request, {'data': data,})
    return HttpResponse(template.render(context))

是否可以创建一个将数据生成到模板的生成器?

类似这样的:

def first_case(request):
    template = loader.get_template('usecases/index.html')
    for data in generator_data():
        context = RequestContext(request, {'data': data,})
        yield HttpResponse(template.render(context))

这是index.html

    <!DOCTYPE html>
    <html>
      <head>
        <title>The d3 test</title>
<style>
.chart {

}

.main text {
    font: 10px sans-serif;  
}

.axis line, .axis path {
    shape-rendering: crispEdges;
    stroke: black;
    fill: none;
}

circle {
    fill: steelblue;
}

</style>
        <script type="text/javascript" src="http://mbostock.github.com/d3/d3.v2.js"></script>
      </head>
      <body>
        <div class='content'>
          <!-- /the chart goes here -->
        </div>
         <!-- {% load static from staticfiles %} -->
        <!-- // <script type="text/javascript" src = "{% static "usecases/scatter.js" %}" ></script> -->
        <script type="text/javascript">

            var data = {{data}};

            var margin = {top: 20, right: 15, bottom: 60, left: 60},
                          width = 960 - margin.left - margin.right,
                          height = 500 - margin.top - margin.bottom;

            var x = d3.scale.linear()
                .domain([0, d3.max(data, function(d) { return d[0]; })])
                .range([ 0, width ]);

            var y = d3.scale.linear()
                .domain([0, d3.max(data, function(d) { return d[1]; })])
                .range([ height, 0 ]);

            var chart = d3.select('body')
                .append('svg:svg').attr('width', width + margin.right + margin.left)
                .attr('height', height + margin.top + margin.bottom)
                .attr('class', 'chart')

            var main = chart.append('g')
              .attr('transform', 'translate(' + margin.left + ',' + margin.top + ')')
              .attr('width', width)
              .attr('height', height)
              .attr('class', 'main')   

            // draw the x axis
            var xAxis = d3.svg.axis()
              .scale(x)
              .orient('bottom');

            main.append('g')
              .attr('transform', 'translate(0,' + height + ')')
              .attr('class', 'main axis date')
              .call(xAxis);

            // draw the y axis
            var yAxis = d3.svg.axis()
              .scale(y)
              .orient('left');

            main.append('g')
              .attr('transform', 'translate(0,0)')
              .attr('class', 'main axis date')
              .call(yAxis);

            var g = main.append("svg:g"); 

            g.selectAll("scatter-dots")
              .data(data)
              .enter().append("svg:circle")
                      .attr("cx", function (d,i) { return x(d[0]); } )
                      .attr("cy", function (d) { return y(d[1]); } )
                      .attr("r", 8);
        </script>
      </body>
    </html>

【问题讨论】:

  • 您要实现的最终用例是什么?
  • 我想将数据从视图流式传输到模板
  • 您是否按照@Wolkodav 的建议查看过 StreamingHttpResponse ?
  • 是的,目前还不清楚如何使用
  • 您想传输什么样的数据?

标签: javascript python django django-views


【解决方案1】:

我知道有StreamingHttpResponse

【讨论】:

    【解决方案2】:

    我没有确切的答案,但也许以下内容会对您有所帮助。正如 Wolkodav 建议的那样,您应该使用 StreamingHttpResponse :

    import time
    from django.http import StreamingHttpResponse
    from django.views.generic import TemplateView
    
    class StreamView(TemplateView):
        template_name = "usecases/index.html"
        response_class = StreamingHttpResponse
    
        def stream_response_generator():
            for x in whatever:
                yield 'whatever_string'
                time.sleep(1)
    
        def get(self, request, *args, **kwargs):
            context = self.get_context_data(**kwargs)
            return self.render_to_response(self.stream_response_generator())
    

    在 urls.py 中:

    url(r'^your_url$', StreamView.as_view())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-17
      • 2013-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-07
      • 1970-01-01
      • 2012-07-26
      相关资源
      最近更新 更多