django+uwsgi部署中静态文件加载失败,这是一个大坑。(本文探讨django1.4以上版本,因为1.3以前有ADMIN_MEDIA_PREFIX这个大坑,本文不作讨论)
首先要理解django中,关于静态路径的分析:
一、为什么调试环境没问题,部署到生产环境就有问题?
调试环境的运行命令:
python manage.py runserver
runserver这个命令知道所有的静态文件在哪里,因为runserver是django的内置命令,而uwsgi不是。
在生产环境中,uwsgi需要用配置文件ini或用命令行的设定static-map
命令行中需要加入:
uwsgi 其它配置 --static-map /static=/srv/django/static
而配置文件ini中需要加入:
static-map = /static=/项目目录/static
如果uwsgi没有设置这个路径,那么它就不知道静态文件在哪里。
二、如果uwsgi已经设置了static-map,但还是有问题,原因?
因为static-map对应的静态目录里,没有静态文件。
这是因为在行动uwsgi前,没有把django静态文件收集到uwsgi指定的静态目录里。
以下代码设置了django开发的应用项目(APP)文件的的静态路径:
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
os.path.join(BASE_DIR, 'app1/static'),
os.path.join(BASE_DIR, 'app2/static'),
]
而django的管理后台的静态路径在:
/usr/local/lib/python3.X/site-packages/django/contrib/admin/static/admin/
uswgi在启动前要把有的有以上两种的静态文件收到到STATIC_ROOT中:
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
而静态文件的URL根目录为:
STATIC_URL = '/static/'
重点!!!:
所以,在项目根目录下运行以下命令,可以把STATICFILES_DIRS与管理admin的静态文件复制到STATIC_ROOT:
python manage.py collectstatic
问题解决。