Django 在
DEBUG = False
时不提供我的媒体文件。
这是我的代码:
DEBUG = False
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static"),
]
STATIC_ROOT = os.path.join(BASE_DIR, "staticfiles")
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'static', 'media')
我尝试了很多方法,但都没有成功。
如果您知道我的问题的答案,请帮助我!
我最近也遇到了类似的问题。
在开发过程中,Django 开发服务器提供静态文件,如 Django 文档 中所述。如果
settings.DEBUG
为 False
,则开发服务器停止提供静态文件服务。请参阅此 Stack Overflow 帖子:为什么 DEBUG=False 设置会使我的 django 静态文件访问失败?
除了这些配置步骤之外,您还需要实际提供静态文件。
在开发过程中,如果您使用 django.contrib.staticfiles,当 DEBUG 设置为 True 时,这将由 runserver 自动完成(请参阅 django.contrib.staticfiles.views.serve())。
这种方法效率极低,而且可能不安全,因此不适合生产。
对于生产,有用于提供静态文件的选项 如此处所述。
我解决了在 Dokku 实例(您见过的最小的 PaaS 实现)上提供静态文件的问题,这与 Heroku 类似。
我使用了一个名为 Whitenoise 的包,该包在 这篇博文中进行了讨论。
我发现 Whitenoise 是为小型 Django 应用程序提供静态文件的最简单的解决方案,而无需配置单独的静态文件服务器。
如果您想部署 django 项目最佳实践,请设置
DEBUG=False
和 ALLOWED_HOSTS=['your_host']
,然后使用命令 ./manage.py collectstatic
收集静态和媒体文件
正如我所看到的,您的问题是关于媒体文件的,但答案是关于静态文件的,如果我们在部署级别看到它们,这些答案会有所不同。对于静态文件,您可以简单地使用白噪声。那会完美地工作。它也适用于媒体文件,但仅当 DEBUG = True 且时间较短时(例如,如果您将应用程序部署在某些使用像 Heroku 这样的 dynos 的平台上,dynos 会在特定时间后刷新。在 Heroku 中为 30 分钟,之后,无论调试设置为 true 还是 false,媒体文件都将被删除。)这在部署过程中是不安全的。因此,为了使您的媒体文件正常工作,您需要一些第三方支持来将媒体文件提供给您的站点,例如Amazon S3 存储桶将存储您的媒体文件并将其提供给您的网站。 希望你能得到答案!
Django 文档包含有关此问题的帮助(链接):
在开发过程中提供用户上传的文件
在开发过程中,您可以从以下位置提供用户上传的媒体文件
使用MEDIA_ROOT
视图。django.views.static.serve()
这不适合生产使用!对于一些常见的部署 策略,请参阅如何部署静态文件。
例如,如果您的
定义为MEDIA_URL
,您可以这样做 将以下代码片段添加到您的media/
:ROOT_URLCONF
from django.conf import settings from django.conf.urls.static import static urlpatterns = [ # ... the rest of your URLconf goes here ... ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
注意
此辅助函数仅在调试模式下工作并且仅在给定的情况下工作 前缀是本地的(例如 media/)而不是 URL(例如 http://media.example.com/)。
我认为您缺少的步骤是您尚未修改根 URL 以将
MEDIA_URL
URL 指向 MEDIA_ROOT
中找到的文件。