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
相关产品推荐
相关产品推荐

