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

DEBUG=False时Django媒体文件(ID卡片)404问题求助

问题描述

使用Django 3.2.8 + Python 3.7.12开发应用,支持用户上传文件至数据库,管理员登录后可点击ID查看用户的ID卡片。DEBUG=True时功能正常,但设置DEBUG=False后,点击查看ID卡片出现404错误。已通过collectstatic处理静态文件(CSS、图片可正常访问),但存储在media文件夹的媒体文件无法访问。

相关配置代码如下:

Settings 配置

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__)) 

STATIC_ROOT = os.path.join(PROJECT_ROOT, 'staticfiles') 
STATIC_URL = 'staticfiles/'

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

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),
)

Model 代码

def path_and_rename(path, prefix):
    def wrapper(instance, filename):
        ext = filename.split('.')[-1]
        project = "pid_%s" % (instance.name,)
        # get filename
        if instance.pk:
            complaint_id = "cid_%s" % (uuid.uuid4().hex,)
            filename = '{}.{}.{}.{}'.format(prefix, project, complaint_id, ext)
        else:
            # set filename as random string
            random_id = "rid_%s" % (uuid.uuid4().hex,)
            filename = '{}.{}.{}.{}'.format(prefix, project, random_id, ext)
            # return the whole path to the file
        return os.path.join(path, filename)
    return wrapper


class Company(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    name = models.CharField(max_length=50)
    id_card = models.FileField(upload_to=path_and_rename("id_card/", 'id_card'), null=True)

Template 代码

<div>
ID : <a href="{{ companys.id_card.url }}">click here</a>
</div>
解决方案

Django在DEBUG=False时不会自动提供媒体文件的HTTP服务,这是出于安全和性能考虑,需要手动配置媒体文件的访问路径。

方法1:临时通过Django处理(仅测试用,不推荐生产)

在项目根urls.py中添加以下代码,让Django在非DEBUG模式下处理媒体文件请求:

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    # 你的现有URL配置
]

if not settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

注意:这种方式性能低下,仅适合临时验证问题,不能用于生产环境。

方法2:用Web服务器配置媒体访问(生产环境推荐)

以Nginx为例,在站点配置文件中添加媒体文件的路由规则,让Web服务器直接处理请求,无需经过Django:

server {
    # 其他配置(如静态文件反向代理、Django服务转发)
    
    location /media/ {
        alias /绝对路径/到/你的项目/media/;  # 替换为MEDIA_ROOT的实际绝对路径
        expires 30d;  # 缓存媒体文件,提升性能
    }
}

配置完成后重启Nginx服务即可生效。

额外检查项

  • 权限验证:确保运行Web服务器或Django进程的用户拥有MEDIA_ROOT目录的读取权限。
  • 文件存在性:确认上传的ID卡片文件确实存在于MEDIA_ROOT/id_card/目录下,文件名与数据库中存储的路径一致。
  • URL正确性:查看页面源码,确认{{ companys.id_card.url }}生成的路径是/media/id_card/xxx.xxx格式,无拼写错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 03:25:49