Django静态jQuery加载404及Apache部署静态资源失效咨询
核心问题
你现在静态文件加载失败是两个配置错误导致的:
- 路径配置错误:Django默认的
BASE_DIR是manage.py所在的目录,对应你项目里的~/pack/mysite/。你原来STATICFILES_DIRS写的是os.path.join(BASE_DIR, 'mysite/static'),实际会去找~/pack/mysite/mysite/static,但你的jQuery实际放在~/pack/mysite/static/js/下,路径完全不匹配,开发环境当然报404。 - 环境逻辑混淆:开发环境下Django会自带静态文件服务,但生产环境(Apache部署)下,
DEBUG=False时Django默认不再处理静态请求,静态资源需要直接由Apache返回,你之前只修了开发环境的临时问题,没做静态收集、也没配Apache的静态路由,部署后必然加载失败。
开发/生产通用静态配置方案
按下面的配置改,一套代码可以同时适配两个环境,不用来回切换:
第一步:修正settings.py静态配置
把原来的静态相关配置替换成下面的内容,注意不要把源文件目录和收集输出目录配成同一个:
STATIC_URL = '/static/' # 你自己存放全局静态源文件的目录,开发环境Django会直接从这里读文件 STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static') ] # 执行collectstatic命令后,所有静态文件会统一汇总到这个目录,专门给生产环境用 # 注意不要和上面的STATICFILES_DIRS路径重复,不然收集静态时会报错 STATIC_ROOT = os.path.join(BASE_DIR, 'collected_static')
第二步:补全开发环境路由
修改根路由文件~/pack/mysite/mysite/urls.py,加开发环境专属的静态路由,这部分配置在生产环境DEBUG=False时会自动失效,不会有副作用:
from django.contrib import admin from django.urls import path from django.conf.urls import url, include from django.conf import settings from django.conf.urls.static import static urlpatterns = [ path('admin/', admin.site.urls), url(r'', include('mssql_app.urls')), ] # 仅开发环境生效,自动代理静态文件请求 if settings.DEBUG: urlpatterns += static(settings.STATIC_URL, document_root=settings.STATICFILES_DIRS[0])
改完这两步,重启开发服务器,jQuery就能正常加载,不会再报404。
Apache生产环境部署正确步骤
生产环境不要让Django处理静态请求,性能差还容易出问题,按下面流程走:
- 把
settings.py里的DEBUG设为False,同时配置好ALLOWED_HOSTS,加上你自己的域名或服务器IP。 - 进入
manage.py所在的~/pack/mysite/目录,执行静态收集命令:
python manage.py collectstatic
执行后,所有app自带的静态文件(比如admin后台的样式、js)、还有你自己放在STATICFILES_DIRS里的静态资源(包括jQuery),都会自动复制到之前配置的collected_static目录下。
3. 修改Apache的虚拟主机配置,新增静态文件别名规则,让/static/开头的请求直接由Apache处理,不要转发给Django的WSGI进程:
# 你原来的WSGI配置保留,比如: WSGIScriptAlias / /home/your_user/pack/mysite/mysite/wsgi.py WSGIPythonPath /home/your_user/pack/mysite # 新增下面这行,把静态路径映射到收集好的静态文件目录 Alias /static/ /home/your_user/pack/mysite/collected_static/ # 给静态目录配置访问权限 <Directory /home/your_user/pack/mysite/collected_static/> Require all granted </Directory> # 原有的WSGI目录权限配置保持不变 <Directory /home/your_user/pack/mysite/mysite/> <Files wsgi.py> Require all granted </Files> </Directory>
注意把路径里的your_user换成你服务器实际的用户名。
4. 重启Apache服务,静态资源就可以正常加载了,不管是你自己放的jQuery还是admin后台的样式都不会出问题。
注意事项
- 每次更新了静态源文件,部署到生产时都要重新执行一次
python manage.py collectstatic,把最新的文件同步到STATIC_ROOT目录。 - 不要图省事在生产环境开Django的静态服务,Apache/Nginx处理静态文件的性能是Django的几十上百倍,生产环境一定要让web服务器直接处理静态请求。
- 模板里引入静态文件的写法不用改,
{% static 'js/jquery-3.1.1.min.js' %}在两个环境下都能正常解析。
内容的提问来源于stack exchange,提问作者xralf
相关产品推荐
相关产品推荐

