部署Django项目至Vercel时持续出现找不到staticfiles_build输出目录的报错
我之前部署Django到Vercel时也碰到过一模一样的问题,折腾了好一阵才解决,给你几个实用的排查和解决步骤:
先确认Vercel的构建命令是否包含收集静态文件的操作
Django不会自动把静态文件收集到STATIC_ROOT指定的目录,必须手动执行collectstatic命令。你需要在Vercel项目的「Settings > Build & Development Settings」里,把Build Command改成类似这样:pip install -r requirements.txt && python manage.py collectstatic --noinput如果你的项目用了Poetry这类依赖管理工具,就对应调整成
poetry install && poetry run python manage.py collectstatic --noinput,确保构建过程中一定会生成静态文件目录。检查
BASE_DIR和STATIC_ROOT的路径是否正确
你的STATIC_ROOT配置看起来没问题,但要先确认BASE_DIR的定义是正确的,标准的BASE_DIR应该是:BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))可以临时在settings里加一行
print(BASE_DIR),本地运行一下看看路径是不是指向你的项目根目录,避免因为路径嵌套错误导致静态文件生成到了奇怪的地方。必须配置
vercel.json指定输出目录和路由
Vercel默认可能识别不到你自定义的静态文件目录,需要在项目根目录创建vercel.json文件,明确告诉它静态资源的位置和请求转发规则,示例配置如下:{ "builds": [ { "src": "你的项目名称/wsgi.py", "use": "@vercel/python", "config": { "maxLambdaSize": "15mb", "runtime": "python3.11" } }, { "src": "staticfiles_build/static/**", "use": "@vercel/static" } ], "routes": [ { "src": "/static/(.*)", "dest": "/staticfiles_build/static/$1" }, { "src": "/(.*)", "dest": "你的项目名称/wsgi.py" } ] }记得把
你的项目名称替换成你实际的Django项目文件夹名(就是包含wsgi.py的那个文件夹)。排查缓存和.gitignore的问题
有时候Vercel的旧构建缓存会搞事情,你可以到项目的「Deployments」页面,找到最近的部署,点击「Redeploy」并勾选「Clear build cache」重新部署。另外,别把staticfiles_build目录加到.gitignore里吗?其实构建时会生成它,所以加了也没关系,但如果之前加了可以临时注释掉测试一下,排除路径被忽略的问题。
按照这几步走,应该就能解决找不到staticfiles_build目录的报错了,我当时就是靠调整构建命令和配置vercel.json搞定的。
备注:内容来源于stack exchange,提问作者Akarshan Ghosh

