Django仅在生产环境中使用私有S3存储

2023-11-21

我已将 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(使用前将#替换为@)

Django仅在生产环境中使用私有S3存储 的相关文章

随机推荐