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})
我有另一个流式传输多部分数据的脚本,但速度较慢,还必须等待服务器响应。
所以问题是,为什么服务器的答案很慢,尽管所有内容都已上传?
答案 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