如何在Django服务中加载React打包文件夹的favicon?manifest.json找不到报错
问题原因
你当前的配置仅处理了/static/和/images/前缀的静态资源请求,而manifest.json、favicon.ico直接存放在build目录根路径下,浏览器请求的是根路径的/manifest.json,没有匹配到对应的静态资源路由规则,因此返回404错误。
解决步骤
1. 调整settings.py配置
在STATICFILES_DIRS中添加build根目录,让Django可以检索到根目录下的静态文件:
STATICFILES_DIRS = [ BASE_DIR / 'static', BASE_DIR / 'build/static', os.path.join(BASE_DIR, 'build/assets'), BASE_DIR / 'build', # 新增该行 ] # 生产环境需要额外配置STATIC_ROOT # STATIC_ROOT = BASE_DIR / 'staticfiles'
2. 配置路由规则,二选一即可
方案1:Django侧新增路由映射(推荐,无需修改前端代码)
在urls.py中新增两个文件的路由重定向规则,同时补全静态文件映射:
from django.views.generic import RedirectView from django.conf import settings from django.conf.urls.static import static urlpatterns = [ path('admin/', admin.site.urls), # 新增以下两行路由 path('favicon.ico', RedirectView.as_view(url='/static/favicon.ico')), path('manifest.json', RedirectView.as_view(url='/static/manifest.json')), path('', TemplateView.as_view(template_name='index.html')) ] # 补全STATIC静态文件映射,开发环境DEBUG=True时也可省略 urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) # 原有MEDIA映射保留 urlpatterns += static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)
该方案逻辑是将根路径下的favicon、manifest请求重定向到/static/前缀路径下,Django会自动从配置的静态文件目录中检索对应文件返回。
方案2:React侧修改资源引用路径
打开React项目public/index.html文件,给favicon和manifest的引用路径添加/static前缀,修改完成后重新执行npm run build更新打包文件即可:
<!-- 修改前 --> <link rel="icon" href="%PUBLIC_URL%/favicon.ico" /> <link rel="manifest" href="%PUBLIC_URL%/manifest.json" /> <!-- 修改后 --> <link rel="icon" href="%PUBLIC_URL%/static/favicon.ico" /> <link rel="manifest" href="%PUBLIC_URL%/static/manifest.json" />
验证
修改完成后重启Django服务,刷新页面查看网络请求,manifest.json和favicon.ico请求状态码应为200,可正常加载。
如果是生产环境部署,执行python manage.py collectstatic后所有静态文件会统一收集到STATIC_ROOT目录,用Nginx等代理服务映射对应静态路径即可。
内容的提问来源于stack exchange,提问作者Veera Silamban
相关产品推荐
相关产品推荐

