Django动态生成静态文件遇404:如何供外部网站以script标签访问
解决Django中动态生成静态文件访问404的问题
咱们先来理清楚问题的根源:你的STATIC_ROOT(也就是staticfiles文件夹)本来是Django为生产环境准备的——用来存放collectstatic命令收集的所有静态文件,但在开发环境下,runserver默认只会加载STATICFILES_DIRS里的目录和各app下static文件夹的内容,不会自动处理STATIC_ROOT里的文件,这就是你自己生成的文件访问404的核心原因。
下面分开发环境和生产环境给出针对性的解决方案:
开发环境解决方案
方案1:让Django在开发环境下同时serve STATIC_ROOT
你可以在项目的urls.py中添加一段配置,让DEBUG模式下的runserver也处理STATIC_ROOT里的文件:
首先导入所需模块:
from django.conf import settings from django.conf.urls.static import static
然后在urlpatterns的末尾添加:
if settings.DEBUG: # 同时serve STATIC_ROOT目录下的静态文件 urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
保存后重启runserver,应该就能访问到staticfiles/bot_js下的文件了。
⚠️ 注意:这种方式仅适用于开发环境,生产环境绝对不能用,因为Django自带的静态文件服务性能很差,无法应对生产流量。
方案2:把动态生成文件放到STATICFILES_DIRS指定的目录
更推荐的做法是创建一个专门存放动态生成静态文件的目录,然后把它加入STATICFILES_DIRS,这样Django开发服务器会自动扫描这个目录:
- 先在项目根目录创建一个新文件夹,比如
dynamic_static - 修改
settings.py中的STATICFILES_DIRS:
STATICFILES_DIRS = ( os.path.join(BASE_DIR, '../frontend/build/static/'), os.path.join(BASE_DIR, 'dynamic_static'), # 新增这一行 )
- 把动态生成的JS文件放到
dynamic_static/bot_js目录下,而不是直接放到staticfiles里
这样开发环境下runserver就能自动找到这些文件,访问http://localhost:8000/static/bot_js/xxx.js就不会404了。
生产环境解决方案
生产环境下我们不会用Django来serve静态文件,一般用Nginx、Apache这类专业web服务器,步骤如下:
- 确保动态生成的JS文件直接生成到
STATIC_ROOT(也就是staticfiles)目录下,或者生成后复制到这里,同时保证web服务器的运行用户有读取这个目录的权限 - 配置web服务器的静态文件路由,以Nginx为例,在配置文件中添加:
location /static/ { alias /你的项目路径/staticfiles/; # 替换成你实际的STATIC_ROOT路径 expires 30d; # 开启浏览器缓存,提升性能 }
- 重启web服务器,外部就能通过
script标签正常引用这些文件了
额外注意事项
- 你用UUID作为文件名的做法非常好,能有效避免浏览器缓存旧文件的问题,建议保持
- 确保动态生成文件的目录和文件权限正确:Django运行用户要有写入权限,web服务器要有读取权限
- 如果生产环境中动态生成文件的频率很高,可以考虑定期执行
collectstatic(不过因为你用了唯一文件名,一般不需要)
内容的提问来源于stack exchange,提问作者daniel william
相关产品推荐
相关产品推荐

