小编306*_*6d0的帖子

使用StreamingHttpResponse和Django Rest Framework CSV

我有一个标准的DRF Web应用程序,可以输出其中一条路径的CSV数据.渲染整个CSV表示需要一段时间.数据集非常大,所以我希望有一个流式HTTP响应,因此客户端不会超时.

但是,使用https://github.com/mjumbewu/django-rest-framework-csv/blob/2ff49cff4b81827f3f450fd7d56827c9671c5140/rest_framework_csv/renderers.py#L197中提供的示例并不能完全实现此目的.数据仍然是一个大的有效载荷而不是分块,并且客户端在接收到字节之前最终等待响应.

结构类似于以下内容:

models.py

class Report(models.Model):
  count = models.PostiveIntegerField(blank=True)
  ...
Run Code Online (Sandbox Code Playgroud)

renderers.py

class ReportCSVRenderer(CSVStreamingRenderer):
  header = ['count']
Run Code Online (Sandbox Code Playgroud)

serializers.py

class ReportSerializer(serializers.ModelSerializer):
  count = fields.IntegerField()

  class Meta:
    model = Report
Run Code Online (Sandbox Code Playgroud)

views.py

class ReportCSVView(generics.Viewset, mixins.ListModelMixin):
  def get_queryset(self):
    return Report.objects.all()

  def list(self, request, *args, **kwargs):
    queryset = self.get_queryset()
    data = ReportSerializer(queryset, many=True)
    renderer = ReportCSVRenderer()

    response = StreamingHttpResponse(renderer.render(data), content_type='text/csv')
    response['Content-Disposition'] = 'attachment; filename="f.csv"'

    return response
Run Code Online (Sandbox Code Playgroud)

注意:必须注释或更改某些内容.

谢谢

python csv django rest django-rest-framework

10
推荐指数
2
解决办法
1814
查看次数

是否可以使用数据 URI 将图像共享到 Facebook?

我有几个画布相互重叠,合并为一个作为数据 URI。一切正常,我可以将合成图像显示在页面上,但我需要的另一个功能是创建 URI,然后共享到 Facebook。我想尝试在不发送到服务器的情况下执行此操作并在客户端完成所有操作。

该代码对于解决问题不是必需的,但如果您想查看它

<ul class="button-group even-2">
                        <li><span id='merge-canvas' class="button expand">Save Image</span></li>
                        <li><span id='share-facebook' class="button expand facebook" >Share</span></li>
</ul>
Run Code Online (Sandbox Code Playgroud)

javascript 看起来像这样。

// DROPBOX AND FILE READER

function noopHandler(evt) {
        evt.stopPropagation();
        evt.preventDefault();
    }

    function drop(evt) {
        evt.stopPropagation();
        evt.preventDefault();

    var files = evt.dataTransfer.files;
    var count = files.length;

    // Only call the handler if 1 or more files was dropped.
    if (count > 0) {

    }
        handleFiles(files);

}

function handleFiles(files) {
    var file = files[0];

    document.getElementById("droplabel").innerHTML = "Processing " + file.name;

    var …
Run Code Online (Sandbox Code Playgroud)

html javascript jquery

5
推荐指数
1
解决办法
1822
查看次数

标签 统计

csv ×1

django ×1

django-rest-framework ×1

html ×1

javascript ×1

jquery ×1

python ×1

rest ×1