Django 静态文件处理

2023年 1月 4日 65.5k 0

1. Django 静态文件分类

Django 静态文件分为两类:static 和 media。

  • static: 是页面引用的 JS、CSS、Image 等文件
  • media:是用户上传的文件

2. 生产环境配置

生产环境,通常配置 Nginx 转发静态文件请求,而 Django 处理动态请求。nginx 配置

1
2
3
4
5
6
7
location /media  {
    alias /path/to/project/media;
}
 
location /static {
    alias /path/to/project/static;
}

在部署时,需要执行 python manage.py collectstatic 命令将 INSTALLED_APPS 列表内的全部 Django App 的静态资源收集到 STATIC_ROOT 指定的目录。

3. 开发环境配置

3.1 配置和使用

第一步,在 INSTALLED_APPS 中加入 ‘django.contrib.staticfiles’第二步,在 urls.py 中新增如下路由,仅在 settings.DEBUG==True 时生效,正式环境使用 Nginx 转发。

1
2
3
4
5
6
7
8
if settings.RUN_MODE == 'DEVELOP':
    urlpatterns += patterns('',
                            url(r'^media/(?P<path>.*)$', 'django.views.static.serve', {
                                'document_root': settings.MEDIA_ROOT,
                            }),
                            url(r'^static/(?P<path>.*)$', 'django.views.static.serve',
                                {'document_root': settings.STATIC_ROOT}),
                            )

第三步,在 settings 文件 TEMPLATES - OPTIONS - context_processors 配置中添加

1
2
django.template.context_processors.static
django.template.context_processors.media

第四步,在模板中使用 STATIC_URLMEDIA_URL 变量static 文件

1
2
3
4
<img src="https://www.chenshaowen.com/blog/{{STATIC_URL}}test.png>

{% load staticfiles %}
<img src="{% static 'img/logo.png' %}">

media 文件

1
<source src="https://www.chenshaowen.com/blog/{{ MEDIA_URL }}movie.ogg" type="video/ogg">

3.2 处理流程

第一步,Django 收到一个静态文件的请求,例如,/static/css/main.css第二步,Django 在 STATICFILES_DIRS 中寻找 css/main.css 这个文件如果第二步找到了,直接返回该文件,否则在 INSTALLED_APPS 列表内全部 Django App 的 static 目录下继续查找。

4. static 相关变量

4.1 STATIC_ROOT

指定执行 python manage.py collectstatic 命令时,静态文件存储的目录

4.2 STATIC_URL

URL 映射,指定静态目录的 URL,默认值为:

1
STATIC_URL = '/static'

4.3 STATICFILES_DIRS

STATICFILES_DIRS 是一个列表,指定工程里哪些目录存放了静态文件。

4.4 STATICFILES_STORAGE

使用 python manage.py collectstatic 命令收集静态文件时,Django 使用的文件存储引擎。如果需要将静态文件托管在其他地方,那么需要修改 STATICFILES_STORAGE 参数,实现相应的方法即可。默认值为:

1
STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.StaticFilesStorage'

4.5 STATICFILES_FINDERS

在开发环境下 django.contrib.staticfiles 查找静态资源的顺序取决于 STATICFILES_FINDERS 的配置,STATICFILES_FINDERS 默认配置如下:

1
2
3
4
STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)
  • django.contrib.staticfiles.finders.FileSystemFinder 用来从 STATICFILES_DIRS 指定的路径中查找静态文件
  • django.contrib.staticfiles.finders.AppDirectoriesFinder 是从 INSTALLED_APPS 列表内全部 Django App 的 static 目录中查找静态文件

5. media 相关变量

5.1 MEDIA_ROOT

MEDIA 存储的是用户上传的文件,比如在 Model 里面的FileField 的文件。如果定义MEDIA_ROOT=C:\media,那么 File = models.FileField(upload_to='file/'),上传的文件就会被保存到 C:\media\file在 settings 里面设置的 MEDIA_ROOT必须是绝对路径,可以这样写:

1
2
3
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
PROJECT_DIR, PROJECT_MODULE_NAME = os.path.split(PROJECT_ROOT)
MEDIA_ROOT = os.path.join(PROJECT_DIR, 'media/')

5.2 MEDIA_URL

MEDIA_URL 是指从浏览器访问时的 URL 前缀,例如:

1
2
MEDIA_ROOT='C:\media\'
MEDIA_URL='/mymedia/'                 

当浏览器访问:http://localhost/mymedia/1.png 就是访问 c:\media\1.png

6. 参考

  • http://www.jianshu.com/p/727dc7631274

相关文章

KubeSphere 部署向量数据库 Milvus 实战指南
探索 Kubernetes 持久化存储之 Longhorn 初窥门径
征服 Docker 镜像访问限制!KubeSphere v3.4.1 成功部署全攻略
那些年在 Terraform 上吃到的糖和踩过的坑
无需 Kubernetes 测试 Kubernetes 网络实现
Kubernetes v1.31 中的移除和主要变更

发布评论