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

部署在Vercel上的Django应用图片无法显示求助

Django部署Vercel后图片无法显示的解决办法

问题核心

Vercel的Python Lambda环境默认不会自动处理/media/路径的静态文件请求,同时部署时MEDIA_ROOT的路径映射和本地存在差异,导致图片无法被正确加载。

具体修复步骤

1. 修改vercel.json配置,添加media路由规则

更新vercel.json,新增专门处理/media/路径的路由,让Vercel直接从项目目录中读取静态文件,而不是转发到WSGI应用:

{
    "builds": [
        { 
            "src": "XPense/wsgi.py", 
            "use": "@vercel/python", 
            "config": { "maxLambdaSize": "15mb", "runtime": "python3.10" } 
        },
        {
            "src": "media/**/*",
            "use": "@vercel/static"
        }
    ],
    "routes": [
        { "src": "/media/(.*)", "dest": "/media/$1" },
        { "src": "/(.*)", "dest": "XPense/wsgi.py" }
    ]
}

注意:路由顺序很重要,/media/的路由要放在全局路由前面,这样优先匹配静态文件请求。

2. 修正settings.py中的MEDIA配置

确保MEDIA_ROOT的路径在部署环境中能正确指向media目录,同时建议添加whitenoise配置辅助静态文件处理(可选但推荐):

import os
from pathlib import Path

BASE_DIR = Path(__file__).resolve().parent.parent

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

# 可选:添加whitenoise配置,需先执行 pip install django-whitenoise
INSTALLED_APPS = [
    # ... 其他已安装应用
    'whitenoise.runserver_nostatic',
    'django.contrib.staticfiles',
    # ...
]

MIDDLEWARE = [
    # ... 其他中间件
    'whitenoise.middleware.WhiteNoiseMiddleware',
]

STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

3. 修正模板中的图片路径

避免硬编码路径,使用Django的MEDIA_URL变量拼接图片地址,确保路径在任何环境下都正确:

<div id="profile-picture-selection" class="grid grid-cols-3 gap-4">
     {% for image in profile_pictures %}
          <input type="radio" name="profile_picture" id="{{image}}" value="{{image}}" style="display: none;">
          <img src="{{ MEDIA_URL }}profile_pictures/{{image}}" alt="{{image}}" class="profile-image-preview rounded-lg cursor-pointer transition transform hover:scale-110" onclick="selectImage('{{image}}', this)">
      {% endfor %}
</div>

如果模板中无法直接使用MEDIA_URL,需要在settings.py的TEMPLATES配置中添加对应的上下文处理器:

TEMPLATES = [
    {
        # ... 其他模板配置
        'OPTIONS': {
            'context_processors': [
                # ... 其他处理器
                'django.template.context_processors.media',
            ],
        },
    },
]

4. 确保media目录被包含在部署包中

检查.vercelignore或.gitignore文件,确保没有排除media目录(如果是固定的静态图片,需要提交到Git仓库;如果是用户上传的动态图片,Vercel的Lambda环境不支持持久化存储,必须使用AWS S3、Cloudinary等第三方云存储服务)。

内容的提问来源于stack exchange,提问作者João J

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 06:14:57