Django通过大文件上传减缓了服务器响应

时间:2018-01-05 14:39:07

标签: python django

Python 3.6和Django 1.11

我从客户multipart/form-data发送到django表单,模型看起来像

class Document(models.Model):
    name = models.CharField(max_length=300)
    author = models.CharField(max_length=100)
    file = models.FileField(upload_to='files/')

我正在使用基于类的视图

class DocumentCreate(CreateView):
    model = Document
    form_class = DocumentForm
    success_url = reverse_lazy('document_list')

和经典的ModelForm:

class DocumentForm(forms.ModelForm):
    class Meta:
        model = Document
        fields = '__all__'

我在嵌入式服务器上,我知道可能表现不佳,但是当我向客户端发送2gb文件时,会看到该文件是在~10秒后创建的(以及数据库条目等...)但是客户端必须再等待10秒才能让django服务器发送响应(与wireshark一起看到)。

我甚至可以在django服务器应答之前keyboardinterupt客户端脚本,而不会对数据传输产生任何影响。

以下是客户端脚本:

fich = open('2go', 'rb')

sess = requests.session()

data = {'author': 'gerard',
        'csrfmiddlewaretoken': csrftoken,
        'name': 'gerard'}
sess.post('http://127.0.0.1:8000/post_document', data=data, files{'file': fich})

我有另一个流式传输多部分数据的脚本,但速度较慢,还必须等待服务器响应。

所以问题是,为什么服务器的答案很慢,尽管所有内容都已上传?

1 个答案:

答案 0 :(得分:0)

来自文档,Where uploaded data is stored

  

如果上传的文件太大,Django会将上传的文件写入存储在系统临时目录中的临时文件中。在类似Unix的平台上,这意味着你可以期待Django生成一个名为/tmp/tmpzfp6I6.upload的文件。如果上传足够大,您可以观看此文件的大小增长,因为Django将数据流式传输到磁盘上。

来自文档,Handling uploaded files with a model

  

调用form.save()时,文件对象将保存到相应FileField的upload_to参数指定的位置

从源代码Storage save

            # This file has a file path that we can move.
            if hasattr(content, 'temporary_file_path'):
                file_move_safe(content.temporary_file_path(), full_path)

结论:您的系统似乎需要很长时间才能将文件从临时“移动”到最终位置。检查您的临时位置是否在最终存储位置的同一分区中,以快速移动文件而不是复制它。您可能需要调整TemporaryFileUploadHandler