【问题标题】:Django media files doesn't work when debug=false当 debug=false 时 Django 媒体文件不起作用
【发布时间】: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
  • 接受对其他读者有帮助的答案。

标签: django django-views


【解决方案1】:

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

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}))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-05
      • 2018-06-05
      • 1970-01-01
      • 2020-04-12
      • 1970-01-01
      • 2018-06-05
      • 2013-12-03
      • 2015-04-13
      相关资源
      最近更新 更多