Django自定义文件存储系统
我有一个自定义的存储方式
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 不太熟悉,任何帮助都非常感谢。谢谢。
3 个回答
1
我尝试做这个,但对我来说不管用,直到我在我的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)
删除的方法会检查文件是否存在。所以这三行代码就足够了。希望这能帮到某些人。
24
你不需要在你的 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
5
你可以把它放在任何地方,但你需要在settings.py文件中指定这个路径。
你可以把这个 storage.py
文件放在根文件夹里(就是那个有 manage.py
的文件夹),然后在设置中把路径指向 storage.AlwaysOverwriteFileSystemStorage
。