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

Django生产模式下新增媒体需重启才能访问的解决方案求助

解决Django生产模式下新增媒体文件需重启才能访问的问题

问题原因

WhiteNoise在启动时会扫描指定目录生成文件索引缓存,后续新增的媒体文件不会自动加入缓存,因此必须重启服务才能被识别。

解决方案:自定义Django视图服务媒体文件

绕过WhiteNoise的缓存机制,直接通过Django视图读取文件系统中的媒体文件,实现动态访问新增文件。

1. 修改urls.py配置

在生产环境下,移除static()的媒体文件路由配置,替换为自定义视图的路由:

from django.conf import settings
from django.contrib import admin
from django.urls import path, include
# 导入自定义视图(根据实际app路径调整)
from botAPI.views import serve_media

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('botAPI.urls')),
]

if settings.DEBUG:
    from django.conf.urls.static import static
    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATICFILES_DIRS[0])
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
else:
    from django.conf.urls.static import static
    urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
    # 替换媒体文件的静态路由为自定义视图
    path('media/<path:path>', serve_media, name='serve_media'),

2. 编写媒体文件服务视图

在你的app(比如botAPI)的views.py中添加以下代码:

import os
from django.conf import settings
from django.http import FileResponse, Http404
from django.views.decorators.http import require_GET
from django.contrib.auth.decorators import user_passes_test

# 仅允许管理员访问媒体文件(匹配你的使用场景)
@user_passes_test(lambda u: u.is_staff)
@require_GET
def serve_media(request, path):
    # 拼接完整的媒体文件路径
    media_file_path = os.path.join(settings.MEDIA_ROOT, path)
    
    # 检查文件是否存在且为有效文件
    if not os.path.exists(media_file_path) or not os.path.isfile(media_file_path):
        raise Http404("媒体文件不存在")
    
    # 返回文件响应
    return FileResponse(open(media_file_path, 'rb'))

3. 移除wsgi.py中WhiteNoise的媒体配置

删掉wsgi.py中关于媒体文件的WhiteNoise初始化代码,保留静态文件的处理:

...
application = get_wsgi_application()
# 移除这一行:application = WhiteNoise(application, root=MEDIA_ROOT, prefix='/media/')
# 保留静态文件的WhiteNoise配置(如果之前有)
application = WhiteNoise(application)
application.add_files(settings.STATIC_ROOT, prefix='/static/')

说明

  • 该方案直接从文件系统读取媒体文件,无需依赖缓存,因此新增文件可立即访问。
  • 加入的user_passes_test装饰器确保只有管理员能访问媒体文件,符合你仅在admin展示的需求。
  • 性能方面,由于仅用于admin场景,流量不大,完全可以满足需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 14:59:51