当 debug=false 时 Django 媒体文件不起作用

Posted

技术标签:

【中文标题】当 debug=false 时 Django 媒体文件不起作用【英文标题】:Django media files doesn't work when debug=false 【发布时间】:2019-09-14 11:24:15 【问题描述】:

settings.py

STATIC_URL = '/static/'
STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.StaticFilesStorage'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'staticfiles')]
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

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

urls.py

urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

handler404 = 'generic.views.invalid_request'

当我设置 DEBUG=False 并使用 python manage.py runserver --insecure 所有静态文件都成功服务,但媒体文件没有出现。在调试控制台媒体 URL 中引发错误 500。

【问题讨论】:

你的问题解决了吗? 是的。 @ans2human 接受对其他读者有帮助的答案。 【参考方案1】:

static 辅助函数 does not work 在 DEBUG=False 模式下。而且不应该。在 prod is not recommended 中使用 Django 提供静态/媒体文件。配置您的网络服务器(nginx、Apache、..)以提供这些文件。

error 500 - 调查日志文件以了解导致应用程序失败的原因。 static file are serve successfully 可能是从浏览器缓存中获取的。

【讨论】:

【参考方案2】:

我一直在使用 WhiteNoise,它允许您的 Web 应用程序提供自己的静态文件,使其成为一个独立的单元,可以部署在任何地方,而无需依赖 nginx、Amazon S3 或任何其他外部服务。

1 - 使用 pip 安装:

pip install whitenoise

2 - 编辑您的 settings.py 文件并将 WhiteNoise 添加到 MIDDLEWARE_CLASSES 列表中,高于除 Django 的 SecurityMiddleware 之外的所有其他中间件:

MIDDLEWARE = [
  # 'django.middleware.security.SecurityMiddleware',
  'whitenoise.middleware.WhiteNoiseMiddleware',
  # ...
]

这就是您在不配置任何第三方服务器的情况下提供静态文件所需的全部内容。

【讨论】:

WhiteNoise 不应该提供媒体文件,只能提供静态文件。它只提供服务器启动时存在的文件,因此它不适合媒体文件。【参考方案3】:

为了在 DEBUG 为 False(并且没有第三方库)时提供 MEDIA_URL,您可以执行以下操作:

  from django.views.static import serve as mediaserve
  urlpatterns.append(url(f'^settings.MEDIA_URL.lstrip("/")(?P<path>.*)$',
                     mediaserve, 'document_root': settings.MEDIA_ROOT))

【讨论】:

以上是关于当 debug=false 时 Django 媒体文件不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Django 在 debug = False 时找不到我的媒体文件夹

我在 cpanel 上的 django 网站没有加载我的媒体文件(从管理员上传的图像)但是当 DEBUG=False 时我的所有 stacticfiles(css 等)都可以工作

媒体文件未在 DEBUG=False Django 2.2.6 中显示

当 DEBUG = False 时 Django 转义 javascript

当 debug=False 时可能导致 Django 错误,而当 debug=True 时不存在

当 DEBUG=False 时,我的 Django 管理面板给出服务器错误(500)