You need to enable JavaScript to run this app. Heroku部署Django时DEBUG=False用户上传图片无法显示问题求助
优惠活动
大模型
产品
解决方案
定价
更多

Heroku部署Django时DEBUG=False用户上传图片无法显示问题求助

问题根因
  • Django自带的static()路由挂载逻辑仅在DEBUG = True时生效,DEBUG = False时默认不会通过Django进程服务媒体文件,这是官方为了生产安全和性能做的限制。
  • Whitenoise仅用于托管预构建的静态文件(即collectstatic命令收集到STATIC_ROOT下的文件),不支持服务用户动态上传的媒体文件,你将MEDIA_ROOT放在静态目录下的配置不会生效。
  • Heroku的文件系统是临时存储:所有上传到dyno本地的文件,会在dyno重启、重新部署、闲置回收时被彻底清空,即使临时修复了访问问题,文件也无法持久保存。
可行解决方案

临时测试方案(仅用于功能验证,不可用于生产)

修改urls.py,手动配置媒体文件的服务路由,强制Django在DEBUG=False时也提供文件服务:

from django.urls import re_path
from django.views.static import serve

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('base.urls')),
    # 新增以下两条路由,优先级放最后
    re_path(r'^static/(?P<path>.*)$', serve, {'document_root': settings.STATIC_ROOT}),
    re_path(r'^images/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT}),
]
# 可以删掉原来的urlpatterns += static(...)的配置

注意:该方案性能极低,且Heroku会定期清空本地文件,仅适合临时验证功能,绝对不能用于生产环境。

生产环境标准方案

使用第三方对象存储服务托管媒体文件,这是Heroku上Django项目的标准做法,推荐两个选项:

选项1:使用AWS S3

  1. 安装依赖:pip install django-storages boto3,将两个包更新到requirements.txt
  2. 修改settings.py配置:
INSTALLED_APPS = [
    # ... 原有应用
    'storages',
]

# S3配置,密钥通过Heroku环境变量设置更安全
DEFAULT_FILE_STORAGE = 'storages.backends.s3boto3.S3Boto3Storage'
AWS_ACCESS_KEY_ID = os.getenv('AWS_ACCESS_KEY_ID')
AWS_SECRET_ACCESS_KEY = os.getenv('AWS_SECRET_ACCESS_KEY')
AWS_STORAGE_BUCKET_NAME = '你的桶名称'
AWS_S3_REGION_NAME = '桶所在区域,比如us-east-1'
AWS_S3_FILE_OVERWRITE = False # 避免重名文件被覆盖

配置完成后所有用户上传的文件会自动存储到S3,访问链接也会自动指向S3地址,不受DEBUG模式和Heroku临时文件系统的影响。

选项2:使用Cloudinary

适合小项目,有免费额度,配置更简单:

  1. 安装依赖:pip install django-cloudinary-storage,更新到requirements.txt
  2. 修改settings.py配置:
INSTALLED_APPS = [
    # ... 原有应用
    'cloudinary_storage',
    'django.contrib.staticfiles', # 注意要放在staticfiles前面
    'cloudinary',
]

DEFAULT_FILE_STORAGE = 'cloudinary_storage.storage.MediaCloudinaryStorage'
CLOUDINARY_STORAGE = {
    'CLOUD_NAME': os.getenv('CLOUDINARY_CLOUD_NAME'),
    'API_KEY': os.getenv('CLOUDINARY_API_KEY'),
    'API_SECRET': os.getenv('CLOUDINARY_API_SECRET')
}

内容的提问来源于stack exchange,提问作者Cute Panda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.14 07:45:03