You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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开发服务器会自动扫描这个目录:

  1. 先在项目根目录创建一个新文件夹,比如dynamic_static
  2. 修改settings.py中的STATICFILES_DIRS:
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, '../frontend/build/static/'),
    os.path.join(BASE_DIR, 'dynamic_static'),  # 新增这一行
)
  1. 把动态生成的JS文件放到dynamic_static/bot_js目录下,而不是直接放到staticfiles里

这样开发环境下runserver就能自动找到这些文件,访问http://localhost:8000/static/bot_js/xxx.js就不会404了。

生产环境解决方案

生产环境下我们不会用Django来serve静态文件,一般用Nginx、Apache这类专业web服务器,步骤如下:

  1. 确保动态生成的JS文件直接生成到STATIC_ROOT(也就是staticfiles)目录下,或者生成后复制到这里,同时保证web服务器的运行用户有读取这个目录的权限
  2. 配置web服务器的静态文件路由,以Nginx为例,在配置文件中添加:
location /static/ {
    alias /你的项目路径/staticfiles/;  # 替换成你实际的STATIC_ROOT路径
    expires 30d;  # 开启浏览器缓存,提升性能
}
  1. 重启web服务器,外部就能通过script标签正常引用这些文件了

额外注意事项

  • 你用UUID作为文件名的做法非常好,能有效避免浏览器缓存旧文件的问题,建议保持
  • 确保动态生成文件的目录和文件权限正确:Django运行用户要有写入权限,web服务器要有读取权限
  • 如果生产环境中动态生成文件的频率很高,可以考虑定期执行collectstatic(不过因为你用了唯一文件名,一般不需要)

内容的提问来源于stack exchange,提问作者daniel william

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 07:07:34