部署在Vercel上的Django项目无法提供图片服务,返回NOT FOUND错误
部署在Vercel上的Django项目无法提供图片服务,返回NOT FOUND错误
兄弟,我完全懂你折腾一天的崩溃感——Django在Vercel上跑其他数据都正常,唯独图片返回NOT FOUND,确实让人头大。我帮你拆解下问题根源,再给你分临时测试和生产环境两种方案解决:
核心问题是什么?
Vercel用的是无服务器Lambda环境,有两个关键限制:
- 本地
media目录里的图片不会自动被打包部署——你的build脚本只处理了静态文件(collectstatic),没把测试用的图片同步到Vercel; - Lambda是无状态的,哪怕你能上传图片到Lambda临时目录,重启或切换实例后文件就没了,根本不适合存用户上传的媒体文件。
方案一:临时解决测试图片的404(仅用于本地测试验证)
如果只是想让本地的测试图片在Vercel上显示,按这两步改:
- 修改
build_files.sh,在collectstatic后加一行复制media目录的命令,把本地图片打包到静态构建目录:
echo "BUILD START" python3.9 -m pip install -r requirements.txt python3.9 manage.py collectstatic --noinput --clear # 新增:把本地media目录复制到Vercel的静态文件目录 cp -r media/ staticfiles_build/media/ echo "BUILD END"
- 更新
vercel.json的路由规则,让Vercel的静态服务处理/media/开头的请求:
{ "builds": [ { "src": "core/wsgi.py", "use": "@vercel/python", "config": { "maxLambdaSize": "15mb", "runtime": "python3.9" } }, { "src": "build_files.sh", "use": "@vercel/static-build", "config": { "distDir": "staticfiles_build" } } ], "routes": [ { "src": "/static/(.*)", "dest": "/static/$1" }, // 新增:处理media请求的路由 { "src": "/media/(.*)", "dest": "/media/$1" }, { "src": "/(.*)", "dest": "core/wsgi.py" } ] }
改完重新部署,测试图片应该就能正常访问了。
方案二:生产环境的正确解决方式(必须做)
上面的临时方案只能凑活用,生产环境绝对不能这么搞——用户上传的图片存不住,而且Vercel也不支持持久化存储。正确做法是把媒体文件托管到第三方云存储服务,比如AWS S3、Cloudinary、Cloudflare R2这些。
以AWS S3为例,步骤如下:
- 安装依赖包:
pip install django-storages boto3
- 在
settings.py里添加配置,把媒体文件的存储切换到S3:
INSTALLED_APPS = [ # ...你的其他应用 'storages', # 新增这个应用 ] # 配置AWS S3信息(替换成你自己的) AWS_ACCESS_KEY_ID = '你的AWS访问密钥ID' AWS_SECRET_ACCESS_KEY = '你的AWS秘密访问密钥' AWS_STORAGE_BUCKET_NAME = '你的存储桶名称' AWS_S3_REGION_NAME = '存储桶所在区域,比如us-east-1' AWS_S3_CUSTOM_DOMAIN = f'{AWS_STORAGE_BUCKET_NAME}.s3.amazonaws.com' # 让媒体文件使用S3存储 DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage' MEDIA_URL = f'https://{AWS_S3_CUSTOM_DOMAIN}/media/' # 注释掉原来的MEDIA_ROOT,因为文件不再存在本地了 # MEDIA_ROOT = os.path.join(BASE_DIR, 'media/article_photos')
这样配置后,用户上传的图片会直接存到S3,请求图片时也会直接从S3返回,完全绕开Vercel的Lambda限制,彻底解决问题。
额外检查点
- 如果你用临时方案,要确认本地
media目录里的测试图片已经推送到Git仓库了——Vercel只能部署Git里有的文件,没推的话复制命令也拿不到文件; - 去Vercel的构建日志里看看
build_files.sh的执行情况,有没有复制失败的报错。
希望这些步骤能帮你搞定这个烦人的问题!
备注:内容来源于stack exchange,提问作者DevolamiTech
相关产品推荐
相关产品推荐

