我已将 django REST API 设置为在调试模式下使用本地存储,在生产环境中使用 S3 存储。这对于公共文件很有效,因为我覆盖了DEFAULT_FILE_STORAGE
像这样:
if IS_DEBUG:
DEFAULT_FILE_STORAGE = 'api.storage_backends.PublicMediaStorage'
和每一个FileField
自动使用它。现在我想以同样的方式使用私有 S3 存储,但是因为我必须显式定义存储(FileField(storage=PrivateMediaStorage())
),始终使用 S3 存储。
在 DEBUG 模式下如何使用本地存储而不是 S3 存储?
PS:我已经考虑过更改模型以使用FileField
有或没有显式存储取决于调试模式。这并没有完全解决我的问题,因为我的迁移是在调试模式下创建的,因此始终包含没有私有存储类的模型。
UPDATE:我正在寻找一种解决方案,可以在两个环境中共享相同的迁移,并且仅在运行时延迟实例化实际的存储类。就像 django 处理DEFAULT_FILE_STORAGE
已经。
最好的解决方案是使用FileField
没有明确的storage
class.
# settings.py
if DEBUG:
DEFAULT_FILE_STORAGE = 'api.storage_backends.PublicMediaStorage'
else:
DEFAULT_FILE_STORAGE = 'api.storage_backends.PrivateMediaStorage'
# models.py
class Foo(models.Model):
file = models.FileField() # without storage
在文件上传过程中,Django会调用DEFAULT_FILE_STORAGE
类在一个lazy时尚。
Note
这些设置不会创建迁移文件storage
范围
UPDATE-1
如果您想对存储进行更多控制,请在模型中创建您自己的自定义文件字段和连接
def get_storage():
"""
Change this function to whatever way as you need
"""
from api.storage_backends import PublicMediaStorage, PrivateMediaStorage
if DEBUG:
return PublicMediaStorage()
else:
return PrivateMediaStorage()
class CustomFileField(models.FileField):
def __init__(self, *args, **kwargs):
kwargs['storage'] = get_storage() # calling external function
super().__init__(*args, **kwargs)
class Foo(models.Model):
file = CustomFileField() # use custom filefield here
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)