我已经将django restapi设置为在调试模式下使用本地存储,在生产环境中使用S3存储。这对于公共文件很有效,因为我重写了DEFAULT_FILE_STORAGE
,如下所示:
if IS_DEBUG:
DEFAULT_FILE_STORAGE = 'api.storage_backends.PublicMediaStorage'
每个FileField
都会自动使用它。现在我想以同样的方式使用私有S3存储,但是因为我必须显式地定义存储(FileField(storage=PrivateMediaStorage())
),所以总是使用S3存储。在
在调试模式下,如何使用本地存储而不是S3存储?在
PS:我已经考虑过将模型更改为使用FileField
,或者根据调试模式使用带或不带显式存储的FileField
。这并没有完全解决我的问题,因为我的迁移是在调试模式下创建的,因此总是包含没有私有存储类的模型。在
更新:
我正在寻找一个解决方案,它可以在两个环境中共享相同的迁移,并且只能在运行时延迟地实例化实际的storageclass。就像django已经处理了DEFAULT_FILE_STORAGE
。在
这听起来有点棘手,那就是在一个项目中同时拥有公共和私有媒体存储。在
下面的示例假设您使用的是django storages,但是不管怎样,该技术都应该起作用。在
通过扩展
S3BotoStorage
类来定义私有存储。在如果使用S3,最好将private和publicpublic存储在不同的S3存储桶中。此自定义存储允许您通过设置指定此参数。在
重要的部分是这个文件的最后2行-它声明了
^{pr2}$private_storage
,以便在您的FileField
中使用:最后,在您的设置文件中,应该这样做。在
最后一条不请自来的建议是:将存储设置从调试模式中分离出来,并允许在环境变量中指定上述所有参数,这通常很有用。在某些时候,您可能希望使用类似生产的存储配置在调试模式下运行应用程序。在
最好的解决方案是使用 类。
FileField
而不使用显式的^{在文件上载过程中,Django将以lazy方式调用
DEFAULT_FILE_STORAGE
类。注
这些设置不会使用
storage
参数创建迁移文件更新-1
如果您想对存储进行更多控制,请创建您自己的自定义文件字段并在模型中连接起来
^{pr2}$相关问题 更多 >
编程相关推荐