当 DEBUG 设为 False 时,Django 不提供媒体文件

问题描述 投票:0回答:4

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

我尝试了很多方法,但都没有成功。
如果您知道我的问题的答案,请帮助我!

python django django-staticfiles django-settings
4个回答
1
投票

我最近也遇到了类似的问题。

在开发过程中,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 应用程序提供静态文件的最简单的解决方案,而无需配置单独的静态文件服务器。


0
投票

如果您想部署 django 项目最佳实践,请设置

DEBUG=False
ALLOWED_HOSTS=['your_host']
,然后使用命令
./manage.py collectstatic

收集静态和媒体文件

0
投票

正如我所看到的,您的问题是关于媒体文件的,但答案是关于静态文件的,如果我们在部署级别看到它们,这些答案会有所不同。对于静态文件,您可以简单地使用白噪声。那会完美地工作。它也适用于媒体文件,但仅当 DEBUG = True 且时间较短时(例如,如果您将应用程序部署在某些使用像 Heroku 这样的 dynos 的平台上,dynos 会在特定时间后刷新。在 Heroku 中为 30 分钟,之后,无论调试设置为 true 还是 false,媒体文件都将被删除。)这在部署过程中是不安全的。因此,为了使您的媒体文件正常工作,您需要一些第三方支持来将媒体文件提供给您的站点,例如Amazon S3 存储桶将存储您的媒体文件并将其提供给您的网站。 希望你能得到答案!


0
投票

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
中找到的文件。

© www.soinside.com 2019 - 2024. All rights reserved.