Django + React应用静态文件404错误排查求助
Django + React 静态文件404问题排查与解决
问题现象
- 网站主体可正常加载,但K5.png、earth.png、manifest.json等静态资源返回404错误
- 控制台报错示例:
[19/Oct/2023 09:38:38] "GET /K5.png HTTP/1.1" 404 2317 [19/Oct/2023 09:38:38] "GET /earth.png HTTP/1.1" 404 2326 [19/Oct/2023 09:38:38] "GET /manifest.json HTTP/1.1" 404 2338
React资源引用代码
<img src="/earth.png" alt="" className="earth w-fit mx-auto"/>
Django配置信息
import os from pathlib import Path # 项目路径定义 BASE_DIR_BACKEND = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) BASE_DIR_FRONTEND = os.path.dirname(BASE_DIR_BACKEND) DEBUG = True ALLOWED_HOSTS = [] CORS_ORIGIN_ALLOW_ALL = True # 已安装应用 INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'api', 'rest_framework', 'djongo', 'pymongo', "corsheaders", ] MIDDLEWARE = [ "corsheaders.middleware.CorsMiddleware", "django.middleware.common.CommonMiddleware", 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] CORS_ALLOW_METHODS = ("GET",) ROOT_URLCONF = 'project_k5.urls' TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [os.path.join(BASE_DIR_BACKEND, '../frontend/build')], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ] WSGI_APPLICATION = 'project_k5.wsgi.application' # 密码验证规则 AUTH_PASSWORD_VALIDATORS = [ {'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator'}, {'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator'}, {'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator'}, {'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator'}, ] # 国际化配置 LANGUAGE_CODE = 'en-us' TIME_ZONE = 'UTC' USE_I18N = True USE_TZ = True # 静态文件配置 STATIC_URL = 'static/' STATICFILES_DIRS = [ os.path.join(BASE_DIR_FRONTEND, 'frontend/build/'), ] DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
项目结构(pnpm run build后)
PROJECT KS ├── .github ├── idea │ └── Build │ └── static │ ├── asset-manifest.json │ ├── earth.png │ ├── favicon.ico │ ├── index.html │ ├── K5.png │ ├── logo192.png │ ├── logo512.png │ ├── manifest.json │ └── robots.ext ├── backend └── frontend └── node_modules └── public ├── earth.png ├── favicon.ico ├── index.html ├── K5.png ├── logo192.png ├── logo512.png ├── manifest.json └── robots.txt
问题根源与修复方案
核心问题
- 静态文件目录配置错误:Django的
STATICFILES_DIRS指向了frontend/build/,但实际构建后的静态文件存放在idea/Build/static/目录,路径完全不匹配。 - 前端资源引用路径错误:React中直接使用
/earth.png会请求网站根路径,但Django的静态资源都挂载在STATIC_URL(即/static/)前缀下,导致路径不匹配。
修复步骤
1. 修正Django静态文件目录
修改settings.py中的STATICFILES_DIRS,指向实际的静态文件目录:
STATICFILES_DIRS = [ os.path.join(BASE_DIR_FRONTEND, 'idea/Build/static/'), ]
2. 修正React资源引用路径
两种可选方式:
- 手动修改React代码中的资源路径,添加
/static/前缀:<img src="/static/earth.png" alt="" className="earth w-fit mx-auto"/> - 在React项目的
package.json中添加"homepage": "/static/",构建后会自动给所有资源路径加上前缀,无需手动修改代码。
3. 验证配置
- 开发环境下重启Django服务器,刷新页面查看资源是否正常加载
- 生产环境需执行
python manage.py collectstatic,将所有静态文件收集到STATIC_ROOT指定的目录
额外验证建议
- 打印
BASE_DIR_FRONTEND确认路径是否正确:print(BASE_DIR_FRONTEND),确保指向PROJECT KS根目录 - 检查Django控制台的静态文件查找日志,确认是否扫描到目标目录
内容的提问来源于stack exchange,提问作者Svene
相关产品推荐
相关产品推荐

