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

部署在Vercel上的Django项目无法提供图片服务,返回NOT FOUND错误

部署在Vercel上的Django项目无法提供图片服务,返回NOT FOUND错误

兄弟,我完全懂你折腾一天的崩溃感——Django在Vercel上跑其他数据都正常,唯独图片返回NOT FOUND,确实让人头大。我帮你拆解下问题根源,再给你分临时测试和生产环境两种方案解决:

核心问题是什么?

Vercel用的是无服务器Lambda环境,有两个关键限制:

  1. 本地media目录里的图片不会自动被打包部署——你的build脚本只处理了静态文件(collectstatic),没把测试用的图片同步到Vercel;
  2. Lambda是无状态的,哪怕你能上传图片到Lambda临时目录,重启或切换实例后文件就没了,根本不适合存用户上传的媒体文件。

方案一:临时解决测试图片的404(仅用于本地测试验证)

如果只是想让本地的测试图片在Vercel上显示,按这两步改:

  1. 修改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"
  1. 更新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为例,步骤如下:

  1. 安装依赖包:
pip install django-storages boto3
  1. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 08:53:05