【问题标题】:Reading InMemoryUploadedFile twice两次读取 InMemoryUploadedFile
【发布时间】:2017-06-23 13:39:10
【问题描述】:

我有一个InMemoryUploadedFile 对象,当我在其上创建.read() 时,它将丢失其内容。

是否有可能从同一个对象读取此内容两次?我试过.copy()它,但那当然不行。

如果不可能,我可以以某种方式将内容放回同一个对象吗?

原因:

在 django 表单中,.prevalidation() 方法会读取内容,但如果是,我以后无法保存。

这里的性能不是问题。

【问题讨论】:

  • 做这样的事情,foo = ''read_once = InMemoryUploadedFile.read() foo = foo + read_once #so , now you will be able to use foo as 2nd time
  • 问题在于它会是一个新对象。

标签: python django django-forms


【解决方案1】:

只是添加到@Daniel Roseman 的答案。

或者你可以直接调用 my_file_obj.open() 。 它做同样的事情。

这是来自 Django 文档的代码

    class InMemoryUploadedFile(UploadedFile):
        def open(self, mode=None):
            self.file.seek(0)
            return self

参考https://docs.djangoproject.com/en/3.0/_modules/django/core/files/uploadedfile/

【讨论】:

    【解决方案2】:

    您应该能够在底层文件对象上调用seek(0)

    my_file_obj.file.seek(0)
    

    【讨论】:

    • 谢谢,这正是我需要的。
    • InMemoryUploadedFile 实现了完整的文件接口,所以你可以直接调用my_file_obj.seek(0)
    • 当我自己偶然发现这个问题时,我只想列出一些关于此的背景信息。如果你 read() 一个文件,光标设置到末尾,通过执行 my_file.file.seek(0) 你重置光标并可以再次使用 read()。
    【解决方案3】:

    我正在从文件源 InMemoryUploadedFile 对 s3 执行写操作。这是我要在 s3 对象上写入的文件缓冲区,它在读取后关闭文件。如果我要寻找但它是不可寻找的对象。

    https://github.com/boto/boto3/issues/256

    所以在 python 中有一个 deepcopy 我制作了一个对象的副本,现在我有两个带有不同缓冲区读取器的对象

    file_obj1 = copy.deepcopy(file_obj)
    buffer1 = file_obj.file
    buffer2 = file_obj1.file
    

    这里的 file_obj 是一个 InMemoryUploadedFile

    【讨论】:

    • 您使用的是哪个 Django 版本?在 Django 3.2.8 上,您会得到一个 TemporaryUploadedFile,而 deepcopy 无法使用它。
    猜你喜欢
    • 2016-05-02
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    • 1970-01-01
    • 2012-03-19
    • 2014-12-01
    相关资源
    最近更新 更多