无论 Django 中的模板更改(或发生其他外部问题)如何,在后台提取大型 zip 文件的最佳方法是啥?
Posted
技术标签:
【中文标题】无论 Django 中的模板更改(或发生其他外部问题)如何,在后台提取大型 zip 文件的最佳方法是啥?【英文标题】:The best way to extract a large zip file in the background regardless of the template changing (or other external issues occurring) in Django?无论 Django 中的模板更改(或发生其他外部问题)如何,在后台提取大型 zip 文件的最佳方法是什么? 【发布时间】:2021-06-03 09:36:08 【问题描述】:我想上传一个包含 1 GB 或更多图像数据的 zip 文件。我有一个函数可以呈现一个基本的 Django 模板,该模板将 zip 文件上传到服务器,然后使用 zipfile 模块将其提取并存储这些图像。
我唯一担心的是,当用户突然在站点周围移动或发生网络错误(或其他一些外部问题)时,功能会中断,并且提取以及数据库存储进度会停止。简而言之,就会发生重复。
如果我再次尝试重新运行该功能,“已存储”的图像会再次存储并随后保存到模型中。一旦python函数被中断,我不确定如何进行文件提取和存储。
我该怎么办?
到目前为止这是我的代码:
def upload(path, id):
try:
with zipfile.ZipFile(path, mode='r', allowZip64=True) as file:
document = Mymodel.objects.get(id=id)
directory_to_extract = f"media/document.path"
file.extractall(directory_to_extract)
except zipfile.LargeZipFile:
print("File size is too large.")
return 0 #returns an error
finally:
file.close()
os.remove(path)
注意:
-
参数'path'是临时文件路径移动到目录中的存储路径。
参数“id”是在提取其子目录之前存储在模型中的 zip 文件 ID,以及其大小、所需路径等属性。
提前谢谢你。
【问题讨论】:
【参考方案1】:我觉得线程在这里可能是一个很好的用例。
def upload(path, id):
try:
with zipfile.ZipFile(path, mode='r', allowZip64=True) as file:
document = Mymodel.objects.get(id=id)
directory_to_extract = f"media/document.path"
file.extractall(directory_to_extract)
except zipfile.LargeZipFile:
print("File size is too large.")
return 0 #returns an error
finally:
file.close()
os.remove(path)
thread = Thread(target=upload, args=(/path/, 3))
thread.start()
thread.join()
【讨论】:
以上是关于无论 Django 中的模板更改(或发生其他外部问题)如何,在后台提取大型 zip 文件的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章