无论 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 文件的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Django中访问子模板中的会话变量?

如何更改 django 模型中的默认时间格式 [重复]

css中的django变量-我可以使用模板吗

Python Django 模板和测试变量是不是为空或空字符串

使用 django 从外部数据库中提取数据到模板

Django 模板自定义标签为布尔值