仅使用 gunicorn、django 和 whitenoise 我如何提供媒体服务?

Posted

技术标签:

【中文标题】仅使用 gunicorn、django 和 whitenoise 我如何提供媒体服务?【英文标题】:Using only gunicorn, django, and whitenoise how do I serve media? 【发布时间】:2020-02-26 00:41:18 【问题描述】:

我的网站终于可以正常工作了,但是当debug = False 时没有提供媒体文件我该怎么办?在this tutorial 之后,我经历了地狱般的尝试,试图让它与 nginx 一起工作,但它一直在中断并且不提供静态服务,所以我选择了纯 gunicorn 和 whitenoise。我真的不是部署专家,只是开发专家。请帮忙。 媒体文件的安全性不是问题,因为只有管理员可以上传它们,最终用户不能。 具体来说,我需要知道世界末日是否将debug = True 仅用于媒体文件。或者,如果有一种简单的方法可以通过 debug = False 为他们提供服务。

【问题讨论】:

当您说没有提供媒体文件时,这是否意味着返回了 404?如果您尝试像 /static// 这样的 URL 会怎样? 是的,我所有的媒体都是 404,就像我没有使用 whitenoise 作为静态,除了我的 /media/ 文件夹。我只是想知道是否有一种方法可以在没有 nginx 的情况下使 /media/ 工作,类似于 whitenoise 用于静态。 【参考方案1】:

您不应该在生产中使用 DEBUG=True,但如果您尝试在开发中测试 Whitenoise 并同时提供媒体服务,这就是我想出的解决方案:

在urls.py中替换这个位:

if settings.DEBUG:
    urlpatterns = [
        # ... the rest of your URLconf goes here ...
    ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

与:

if settings.DEBUG or settings.STAGE == 'local':
    urlpatterns.extend(
        [re_path(r'^%s(?P<path>.*)$' % re.escape(settings.MEDIA_URL.lstrip('/')), serve, kwargs='document_root': settings.MEDIA_ROOT)]
    )

关键部分是要有一个 STAGE 变量来指示您在哪个环境中运行站点。

【讨论】:

【参考方案2】:

以下是我设置 Whitenoise 为我的应用程序提供静态文件的方法。我正在使用 RedHat 7,但在 Ubuntu 中应该是类似的。我的 Django 版本是 1.11。

请注意,在开发环境之外使用 DEBUG=True 运行是不安全的。

首先,我设置了一个指向静态文件位置的环境变量:

export DJANGO_STATIC_ROOT=/home/<user>/<project>/staticfiles

在settings.py中:

## Static files

STATIC_URL = '/static/'

if DEBUG:
    STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
else:
    STATIC_ROOT = environ['DJANGO_STATIC_ROOT']

## Whitenoise - Insert in 2nd place after SecurityMiddleware

MIDDLEWARE_CLASSES.insert(1,'whitenoise.middleware.WhiteNoiseMiddleware')

# Add app before django.contrib.staticfiles to enable Whitenoise in development

for i, app in enumerate(INSTALLED_APPS):
    if app == 'django.contrib.staticfiles':
        insert_point = i
INSTALLED_APPS.insert(insert_point,'whitenoise.runserver_nostatic')

每次部署应用时,请务必运行 collectstatic 命令来更新 DJANGO_STATIC_ROOT 位置中的文件:

./manage.py collectstatic

祝你好运!

【讨论】:

我的 gunicorn 和 whitenoise 的静态工作正常,没有提供的是我的媒体文件。

以上是关于仅使用 gunicorn、django 和 whitenoise 我如何提供媒体服务?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Gunicorn 和 nginx 部署 Django 项目

如何让 Django 使用 Gunicorn 提供静态文件?

使用 nginx 和 gunicorn 运行多个 django 项目

Django 使用gunicorn 和 supervisord部署

使用 Nginx、Gunicorn 和 Supervisor 部署 Django

使用 Gunicorn 运行 Django - 最佳实践