将Minio设置为Django的默认Storage(django-storages)

这里写自定义目录标题

前置说明

静态文件

Django默认的Storage是本地,项目中的CSS、图片、JS都是静态文件。一般会将静态文件放到一个单独的目录中,以方便管理。在html页面中调用时,也需要指定静态文件的路径,Django中提供了一种解析的方式配置静态文件的路径。静态文件可以放在项目根目录下,也可以放在子应用的目录下,由于有些静态文件在项目中是通用的,所以推荐放在项目的根目录下,方便管理。

为了提供静态文件,需要配置两个参数:

  • STATICFILES_DIRS=[]:存放查找静态文件的目录,接收的是list;
  • STATIC_URL:访问静态文件URL前缀。
python 复制代码
# 1. 静态文件的路由
STATIC_URL = '/static/'

# 2. 访问静态文件时,会遍历列表中的文件夹,找到对应的静态文件
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static_files')]
# 配置静态文件夹路径 未来可能会有很多静态文件夹,都在这里配置

# 3.访问的地址:127.0.0.1:8000/static/xxxx

在生产环境下,即Debug=False时,Django将不再对外提供静态文件,而需要使用collectstatic命令收集静态文件并交由静态文件服务器来提供服务。

收集静态文件

我们需要收集项目中的静态文件,并放到静态文件服务器中,一般使用Nginx服务器作为静态文件服务器。

在settings.py中设置收集静态文件的目录

python 复制代码
# 这是Django默认存储的配置,下面使用Minio就用不到这个配置了
STATIC_ROOT = os.path.join(os.path.dirname(BASE_DIR), 'staticfiles')

执行收集静态文件命令,该命令会将项目中所有的静态文件复制到第一步建的目录下。

shell 复制代码
python manage.py collectstatic

使用django-storages来使Django集成Minio

安装依赖

为什么使用django-storages,而不使用django-storages-minio、django-minio,因为Github上的star没有django-storages多,而且PyPi上也已经没有版本迭代了,最重要的是照着资料配置,最后都没成功。django-storages好像是官方的组件。

Minio和AmazonS3的API完全兼容,所以直接使用Amazon S3的API即可,官方文档:https://django-storages.readthedocs.io/en/latest/backends/amazon-S3.html#

shell 复制代码
# 安装依赖
pip instll django-storages[s3] minio

需不需要"[s3]"没有详细的测试,多按一个包也没几兆。

settings.py

注意:桶需要自己创建好。

python 复制代码
# 注册应用
INSTALLED_APPS = [
    # ......   
    'storages',
    # ......
]

STATIC_URL = '/static/'  # 静态文件的路由
MEDIA_URL = '/media/'  # 媒体文件的路由
STORAGES = {
    # default是媒体文件的配置
    'default': {
        "BACKEND": "storages.backends.s3.S3Storage",  # 替换Djangpo默认的Stroage
        "OPTIONS": {
            'access_key': 'root',  # Minio账号
            'secret_key': '123456',  # Minio密码
            'bucket_name': 'data-monitor', # Minio中桶名称,需要自己创建
            'file_overwrite': False,  # 同名文件是否允许覆盖
            'use_ssl': False,  # 是否使用Https,False就是使用Http
            'endpoint_url': 'http://127.0.0.1:9000',  # Minio服务地址
            # 'location': 'media'  # 指定媒体文件的MEDIA_ROOT,不指定就是桶的根目录
        },
    },
    # staticfiles是静态文件的配置
    'staticfiles': {
        "BACKEND": "storages.backends.s3.S3Storage",  # 替换Djangpo默认的Stroage
        "OPTIONS": {
            'access_key': 'root',
            'secret_key': '123456',
            'bucket_name': 'data-monitor',  # Minio中桶名称,程序不能自动创建
            'file_overwrite': False,
            'use_ssl': False,
            'endpoint_url': 'http://127.0.0.1:9000',
            'location': 'staticfiles',  # 收集静态文件到哪个目录,不指定默认在桶根目录下
        },
    },
}

测试收集静态文件

shell 复制代码
python manage.py collectstatic



通过静态路由访问静态文件:http://127.0.1:5002/static/admin/img/calendar-icons.svg,可以直接将文件展示出来。

测试媒体文件

创建一个子应用,在子应用的models.py中创建一个模型类,过程略。

python 复制代码
class MyModel(models.Model):
    title = models.CharField(max_length=255)
    # settings中没有配置MEDIA_ROOT的路径默认就是桶的根目录
    # 这里指定的是上传到MEDIA_ROOT的哪个文件夹中,
    # 即"MEDIA_ROOT/upload_to",路径会自动创建
    file = models.FileField(upload_to='media/')  # 加不加最后的/都可以

将模型注册到Django Admin中,在admin.py中配置

python 复制代码
@admin.register(models.MyModel)
class MyModelAdmin(admin.ModelAdmin):
    pass

迁移模型类

shell 复制代码
python manage.py makemigrations
python manage.py migrate

访问Django Admin,找到刚才的模型类,点击Add创建一条新纪录。


去Minio上查看,自动创建了media目录,目录中多了刚才选中的文件。


相关推荐
董建光d几秒前
PyTorch 实现 MNIST 手写数字识别完整流程(含数据处理、模型构建与训练可视化)
人工智能·pytorch·python
小宁爱Python1 小时前
从零搭建 RAG 智能问答系统3:聊天信息持久化和登录注册
python
天才少女爱迪生2 小时前
LLVM(Low Level Virtual Machine)介绍
python·数据挖掘
碳酸的唐6 小时前
A* 工程实践全指南:从启发式设计到可视化与性能优化
python·神经网络
倔强青铜三9 小时前
苦练Python第64天:从零掌握多线程,threading模块全面指南
人工智能·python·面试
分布式存储与RustFS9 小时前
告别复杂配置:用Milvus、RustFS和Vibe Coding,60分钟DIY专属Chatbot
wpf·文件系统·milvus·对象存储·minio·rustfs·vibe
Q264336502310 小时前
【有源码】基于Hadoop生态的大数据共享单车数据分析与可视化平台-基于Python与大数据的共享单车多维度数据分析可视化系统
大数据·hadoop·python·机器学习·数据分析·spark·毕业设计
计算机毕业设计木哥10 小时前
计算机毕设选题推荐:基于Hadoop和Python的游戏销售大数据可视化分析系统
大数据·开发语言·hadoop·python·信息可视化·spark·课程设计
小蕾Java10 小时前
PyCharm 2025:使用图文教程!
ide·python·pycharm