Django开发中,我们一般都不管static文件(CSS,JS,picture…)的位置。其实这是因为Django已经帮我们搜集和处理这些静态文件。缺省的搜集目录是:
- 每个app内部的static目录;
- STATICFILES_DIRS 定义的附加目录。
在我们需要deploy产品的时候,我们需要把Debug mode关闭。这个时候,当在我们访问主页,这些静态的文件就会变的不可用。
这是因为Django本身的static处理过于低效。在Debug模式被关闭之后,Django假定所有的静态文件都需要通过wsgi协议接口来存取。开发者需要设置单独的wsgi server来支持Django的静态文件存取。
如果你是开发一个大网站,建议你通过Apache或其它方式来运行wsgi。你可以在这里得到更多信息:
https://docs.djangoproject.com/zh-hans/2.2/howto/deployment/wsgi/
但是对许多小网站来说,附加的开发和配置会让事情变得过于复杂。那么Django自己有没有app可以直接支持wsgi呢?答案是有的。下面就是具体一步步来实现这个。
第一步:安装whitenoise
这个就是一个python写的遵循wsgi的包。你需要安装它。
pip install whitenoise
第二步,添加middleware
需要在Django里面添加中间件。这些中间件其实就是一些钩子函数。
#settings.py
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware',
...
]
第三步: 添加如下内容在你的settings.py最后。
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, "static_dep")
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static')
]
STATIC_URL 这个就是你的网页URL地址中静态文件的相对位置。
STATIC_ROOT是在deployment的时候,静态文件在文件系统中的最终绝对路径。
STATICFILES_STORAGE 让你的所有静态文件支持压缩。比如一个233K的Jquery,通过压缩之后,只需要传输72K。
STATICFILES_DIRS : 是附加的静态文件在开发阶段的存放位置。
第四步:运行manager.py去搜集所有的static文件到目的目录。
python manage.py collectstatic
Django将会搜索STATICFILES_DIRS 以及各个App/static目录,然后拷贝到STATIC_ROOT。
然后压缩各个文件生成固定版本的压缩文件。下载的时候,压缩文件将会被传输。
如果你修改啦静态源文件,记得重新运行这个命令。它有版本控制来区分压缩文件。
Log 功能
此外,当Debug mode关闭之后,你会遇到log打印不出来的情况。这让开发很低效。
把下面的内容copy到你的settings.py最后。是不是log又回来啦?
记得在真正deploy的时候注释掉这段内容。
#This is logging in deployment
LOGGING = {
"version": 1,
"disable_existing_loggers": False,
"handlers": {
"console": {
"class": "logging.StreamHandler",
},
},
"loggers": {
"django": {"handlers": ["console"], "level": "INFO"},
},
}