Django是否将压缩后的目录保存为文件,或者这里会发生什么?

Django是否将压缩后的目录保存为文件,或者这里会发生什么?,django,linux,docker,openedx,scorm1.2,Django,Linux,Docker,Openedx,Scorm1.2,我正在使用OpenEdX,它有一个插件系统,叫做XBlocks,在这种情况下,它允许导入由第三方“studio应用程序”创建的内容。这些内容可以作为zip文件上传。然后由以下代码进行处理: @XBlock.handler def studio_submit(self, request, _suffix): self.display_name = request.params["display_name"] self.width =

我正在使用OpenEdX,它有一个插件系统,叫做XBlocks,在这种情况下,它允许导入由第三方“studio应用程序”创建的内容。这些内容可以作为zip文件上传。然后由以下代码进行处理:

@XBlock.handler

    def studio_submit(self, request, _suffix):

        self.display_name = request.params["display_name"]

        self.width = request.params["width"]

        self.height = request.params["height"]

        self.has_score = request.params["has_score"]

        self.weight = request.params["weight"]

        self.icon_class = "problem" if self.has_score == "True" else "video"



        response = {"result": "success", "errors": []}

        if not hasattr(request.params["file"], "file"):

            # File not uploaded

            return self.json_response(response)



        package_file = request.params["file"].file

        self.update_package_meta(package_file)



        # First, save scorm file in the storage for mobile clients

        if default_storage.exists(self.package_path):

            logger.info('Removing previously uploaded "%s"', self.package_path)

            default_storage.delete(self.package_path)

        default_storage.save(self.package_path, File(package_file))

        logger.info('Scorm "%s" file stored at "%s"', package_file, self.package_path)



        # Then, extract zip file

        if default_storage.exists(self.extract_folder_base_path):

            logger.info(

                'Removing previously unzipped "%s"', self.extract_folder_base_path

            )

            recursive_delete(self.extract_folder_base_path)

        with zipfile.ZipFile(package_file, "r") as scorm_zipfile:

            for zipinfo in scorm_zipfile.infolist():

                default_storage.save(

                    os.path.join(self.extract_folder_path, zipinfo.filename),

                    scorm_zipfile.open(zipinfo.filename),

                )



        try:

            self.update_package_fields()

        except ScormError as e:

            response["errors"].append(e.args[0])



        return self.json_response(response)
代码在哪里

                default_storage.save(

                    os.path.join(self.extract_folder_path, zipinfo.filename),

                    scorm_zipfile.open(zipinfo.filename),

                )
是以下(Django)错误跟踪的来源:

cms_1             |   File "/openedx/venv/lib/python3.5/site-packages/openedxscorm/scormxblock.py", line 193, in studio_submit
cms_1             |     scorm_zipfile.open(zipinfo.filename),
cms_1             |   File "/openedx/venv/lib/python3.5/site-packages/django/core/files/storage.py", line 52, in save
cms_1             |     return self._save(name, content)
cms_1             |   File "/openedx/venv/lib/python3.5/site-packages/django/core/files/storage.py", line 249, in _save
cms_1             |     raise IOError("%s exists and is not a directory." % directory)
cms_1             | OSError: /openedx/media/scorm/c154229b568d45128e1098b530267a35/a346b1db27aaa89b89b31e1c3e2a1af04482abad/assets exists and is not a directory.
我也在github上发布了这个问题

异常文件ExistError 尝试创建已存在的文件或目录时引发。对应于errno EEXIST

我真的不明白发生了什么事。它基于分层docker容器中的javascript,所以我不能轻易地破解和打印额外的信息

我唯一发现的是,在抛出错误时,zip文件中的一些文件夹作为文件而不是目录写入docker卷。然而,这可能是意料之中的,这些文件可能会被重写为目录,或在以后的Linux(?)上更改为目录

错误列出了
资产
文件夹

root@93f0d2b9667f:/openedx/media/scorm/5e085cbc04e24b3b911802f7cba44296/92b12100be7651c812a1d29a041153db5ba89239# ls -la
total 84
drwxr-xr-x 2 root root  4096 Aug  2 22:17 .
drwxr-xr-x 3 root root  4096 Aug  2 22:17 ..
-rw-r--r-- 1 root root  4398 Aug  2 22:17 adlcp_rootv1p2.xsd
-rw-r--r-- 1 root root     0 Aug  2 22:17 assets
-rw-r--r-- 1 root root     0 Aug  2 22:17 course
-rw-r--r-- 1 root root 14560 Aug  2 22:17 imscp_rootv1p1p2.xsd
-rw-r--r-- 1 root root  1847 Aug  2 22:17 imsmanifest.xml
-rw-r--r-- 1 root root 22196 Aug  2 22:17 imsmd_rootv1p2p1.xsd
-rw-r--r-- 1 root root  1213 Aug  2 22:17 ims_xml.xsd
-rw-r--r-- 1 root root  1662 Aug  2 22:17 index.html
-rw-r--r-- 1 root root     0 Aug  2 22:17 libraries
-rw-r--r-- 1 root root  1127 Aug  2 22:17 log_output.html
-rw-r--r-- 1 root root   481 Aug  2 22:17 main.html
-rw-r--r-- 1 root root   759 Aug  2 22:17 offline_API_wrapper.js
-rw-r--r-- 1 root root     0 Aug  2 22:17 player
-rw-r--r-- 1 root root  1032 Aug  2 22:17 popup.html
root@93f0d2b9667f:/openedx/media/scorm/5e085cbc04e24b3b911802f7cba44296/92b12100be7651c812a1d29a041153db5ba89239# cd assets
bash: cd: assets: Not a directory

从压缩文件夹中删除
/assets
文件夹会将错误消息更改为下一个文件夹<代码>/course因此,似乎资产和课程确实是作为文件创建的,这导致了错误。但是,也有具有不同结构的zip文件,其中也会抛出错误,但上载成功。这会使错误变得不重要,并且会发生其他事情。当然,这似乎很少见,但机会很小。预先创建所有子目录可以使上载成功。。。因此,这似乎是Python代码中的一个错误,因为Django已经过良好的测试,它必须在XBlock的代码中从压缩文件夹中删除
/assets
文件夹会将错误消息更改为下一个文件夹<代码>/course因此,似乎资产和课程确实是作为文件创建的,这导致了错误。但是,也有具有不同结构的zip文件,其中也会抛出错误,但上载成功。这会使错误变得不重要,并且会发生其他事情。当然,这似乎很少见,但机会很小。预先创建所有子目录可以使上载成功。。。因此,这似乎是Python代码中的一个错误,因为Django已经过良好的测试,它一定在XBlock的代码中