仅使用 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?如果您尝试像您不应该在生产中使用 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部署