【问题标题】:Django Custom File Storage systemDjango 自定义文件存储系统
【发布时间】:2011-02-04 05:47:24
【问题描述】:

我有一个自定义存储

import os
from django.core.files.storage import Storage


class AlwaysOverwriteFileSystemStorage(Storage):
    def get_available_name(self, name):
        """
        Directly Returns a filename that's 
        from what user input.
        """
        if self.exists(name):
    # Remove the existing file
        os.remove(name)
    # Return the input name as output
        return name

我想知道我应该把他的AlwaysOverwriteFileSystemStorage.py文件放在哪里以及应该如何通过settings.py定义DEFAULT_FILE_STORAGE

我的 Django 根文件夹是 /home/username/webapp

当我输入DEFAULT_FILE_STORAGE = 'site.storage.AlwaysOverwriteFileSystemStorage' 时,它返回一个

错误

导入存储模块 site.storage 时出错:“没有名为 storage 的模块”

我不熟悉 Python/Django,任何帮助将不胜感激。谢谢。

【问题讨论】:

  • 根据您的路径,您的项目似乎被称为“站点”,并且里面有一个名为“存储”的目录。确保“storage”中有一个空白的 init.py 文件。

标签: python django


【解决方案1】:

您无需在settings.py 中添加任何内容。只需直接在您的模型中使用它。例如,在您的应用所在的任何位置创建storage.py 并将OverwriteStorage() 放入其中。然后,您的模型可能如下所示:

from storage import OverwriteStorage
...
class MyModel(models.Model):
    ...
    image = ImageField(upload_to='images', storage=OverwriteStorage())

我还使用自定义存储系统来覆盖现有文件。我的storage.py 看起来像这样:

from django.core.files.storage import FileSystemStorage

class OverwriteStorage(FileSystemStorage):
    """
    Returns same name for existing file and deletes existing file on save.
    """                                                              
    def _save(self, name, content):
        if self.exists(name):
            self.delete(name)
        return super(OverwriteStorage, self)._save(name, content)

    def get_available_name(self, name):
        return name

【讨论】:

    【解决方案2】:

    你可以把它放在任何地方,但你应该在settings.py中指向那里的路径

    你可以把这个storage.py文件放在根文件夹(有manage.py的那个),把路径指向storage.AlwaysOverwriteFileSystemStorage

    【讨论】:

    • 这应该是正确接受的答案,因为它解决了问题而不是绕过它。
    【解决方案3】:

    我尝试做这个,但不要为我工作,直到我在我的 storage.py 上做这个:

    import os
    from django.conf import settings
    from django.core.files.storage import FileSystemStorage
    
    
    class MyFileSystemStorage(FileSystemStorage):
        def get_available_name(self, name, *args, **kwargs):
            if self.exists(name):
                os.remove(os.path.join(settings.MEDIA_ROOT, name))
            return super().get_available_name(name, *args, **kwargs)
    

    无需进行其他更改。

    你这样做的另一种方式:

    from django.core.files.storage import FileSystemStorage
    
    class AvatarStorage(FileSystemStorage):
    
        def get_available_name(self, name, *args, **kwargs):
            self.delete(name)
            return super().get_available_name(name, *args, **kwargs)
    

    delete 方法检查文件是否存在。所以这3行就足够了。 我希望这对某人有所帮助

    【讨论】:

      猜你喜欢
      • 2012-07-02
      • 2010-11-29
      • 2016-09-23
      • 2016-10-14
      • 1970-01-01
      • 1970-01-01
      • 2019-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多