本文讲解了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的文件夹内,为了防止同名覆盖,拷贝的规则是
python manage.py collectstatic3.模板标签
在模板中使用静态文件,一般都是引用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
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', ]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 条评论) “” |