为什么不能在生产环境中使用Django提供静态文件服务?

3

我遇到了以下关于settings.py的例子:

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

并被告知:

static()帮助函数适用于开发,但不适用于生产环境。永远不要在生产环境中使用Django来提供静态文件。

有人能解释一下为什么以及如何更好地使用它吗?

编辑:

我可以在Apache中使用static()吗?


1
请查看这些提示此处 - nbryans
@nbryans 这些技巧很有趣,但是我没有看到一般情况下我的问题的答案。它仅告诉我不要在´manage.py runserver´中使用静态文件。我想知道为什么我不能在Apache上使用它? - user2853437
如果您想从WSGI服务器提供静态文件,WhiteNoise 是更好的选择。如果设置允许,WhiteNoise 将使用 Web 服务器通过 sendfile() 系统调用直接从磁盘推送实际文件内容。static() 助手将加载文件到 Python 内存中并通过 WSGI 处理程序发送它。这些额外的层应尽可能避免,特别是对于较大的文件。 - knbk
1
使用专门构建的Web服务器设施仍然比使用WhiteNoise更好。因此,如果使用Apache/mod_wsgi,请使用Apache处理静态文件,而不是WhiteNoise。如果在nginx后面使用uWSGI或Gunicorn,请使用nginx。但是,您仍然可能希望使用WhiteNoise,如果与CDN一起工作以缓存内容。 - Graham Dumpleton
1个回答

5
Django并不适合用于提供静态文件的服务,官方文档中有这样的描述:“这种方法非常低效且可能不安全,因此不适用于生产环境。”最好使用专门设计用于提供静态内容的工具。在Django文档的部署静态文件中有详细的设置静态服务器的说明。
基本思路是不要让Django无谓地参与提供静态文件的服务。让你的生产服务器(从你的评论中看来是apache)直接提供静态文件。以下是编辑httpd.conf文件的说明,以便apache可以提供静态文件:https://docs.djangoproject.com/en/1.10/howto/deployment/wsgi/modwsgi/#serving-files。django中的static()函数不应该被涉及。确保使用django的collectstatic管理命令将所有静态文件复制到STATIC_ROOT目录中,以便apache可以找到它们。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接