Django使用Static静态文件以及Media文件

本文讲解了Django中Static文件和Media文件的区别,以及它们在开发环境和生产环境的用法。

一、Django中Static files和Media files的定义和区别

1.Static files包括CSS样式文件、Javascript文件、字体文件和图片媒体文件等,一般存放在项目的Static文件夹中。而且这些文件和代码文件放在一起,可以进行版本控制。

2.Media files主要指的是用户上传到网站中的文件,这里的文件基本上是使用网站过程产生的内容,需要和数据库一样定时备份。

3.为什么需要把两种文件区分开?首先我们不能完全信任用户上传的media文件,另外如果不区分的话,用户上传media文件还有可能破坏掉static静态文件。

二、Static files静态文件的使用

1.在Settings.py中配置如下内容:

STATIC_URL:很多人在Django入门的时候,分不清楚STATIC_URL和STATIC_ROOT。简单来说,URL就是在浏览器中输入的那串路径,STATIC_URL代表静态文件的URL从哪里开始,例如默认一般是/static/,代表访问静态文件就从http://127.0.0.1:8000/static/这里开始,比如访问某一个css文件,就是http://127.0.0.1:8000/static/css/main.css。

STATIC_ROOT:Django程序真正存储static静态文件的绝对路径。这里指的路径是指存储在服务器上的路径,windows下一般是D:\Home\webs\abc_project\static,Linux中一般是/home/webs/abc_project/static。

STATICFILES_DIRS: 很简单,指定其他存放Static文件的路径。

2.命令语句

Django中很多app内,都会有一个Static文件夹,使用 collectstatic命令,将会把各个app内的static文件拷贝到static_root的文件夹内,为了防止同名覆盖,拷贝的规则是/static。

  python manage.py collectstatic

3.模板标签

在模板中使用静态文件,一般都是引用css文件、Javascript文件和图片文件,类似这样,先load static, 然后按照这个方式引用

{% load static %}

4.开发模式下配置Static files

Settings.py中设置

# settings.py
DEBUG = True
STATIC_URL = '/static/'
STATIC_ROOT = BASE_DIR / 'staticfiles'
STATICFILES_DIRS = [BASE_DIR / 'static',]
STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.StaticFilesStorage'

5.生产模式下配置Static files 配置WhiteNoise

  • 安装 pip install whitenoise
  • 在SecurityMiddleware中间件之后,配置好whitenoise的中间件
MIDDLEWARE = [        'django.middleware.security.SecurityMiddleware',        'whitenoise.middleware.WhiteNoiseMiddleware',  # <---- WhiteNoise!        'django.contrib.sessions.middleware.SessionMiddleware',        'django.middleware.common.CommonMiddleware',        'django.middleware.csrf.CsrfViewMiddleware',        'django.contrib.auth.middleware.AuthenticationMiddleware',        'django.contrib.messages.middleware.MessageMiddleware',        'django.middleware.clickjacking.XFrameOptionsMiddleware',    ]
  • 设置whitenoise支持压缩和缓存(可选),在settings.py中设置:
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

三、Media files的使用

前面我们说过,Media files主要是用户上传的文件,而且上传的时候,后台一般都会关联着FileField或者ImageField,并且将相关上传的文件信息存储到数据库中。在配置上,主要是配置好MEDIA_URL和MEDIA_ROOT,这两个参数和Static files静态文件很像,就不多做解释了。

1.开发模式中配置Media files

首先在settings.py中定义好如下内容:

MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'uploads'

其次在项目urls.py中增加一个static路径作为media的url和root:

from django.conf import settings
from django.conf.urls.static import static
from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    # ... the rest of your URLconf goes here ...
]

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

2.生产模式中配置Media files

生产模式下一般无法使用whitenoise,所以最佳的办法就是使用nginx,具体配置方法如下,当请求访问/media/file.png,Nginx就会重定向到/home/app/web/mediafiles/中。

server {
    listen 80;
    location / {
        ...
    }
    location /media/ {
        alias /home/app/web/mediafiles/;
    }
}

四、总结

本文介绍了Static files和Media files的定义和区别,并分别介绍了它们在生产和开发环境中简单配置方法,这里没有讲到的是文件存储相关设置,设置好后可以让网站从云或者CDN中访问静态文件或者Media文件,一般给网站加速用,感兴趣的可以自行‬搜索‬。


文章同步更新微信公众号:Django编程

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章