Django - 生产环境中服务媒体/上传文件

11 投票
4 回答
9831 浏览
提问于 2025-04-18 01:15

我现在在我的项目的urls.py文件里有这些内容,最后一行是最重要的。

urlpatterns = patterns('',
    url(r'^', include('polls.urls', namespace="polls")),
    url(r'^admin/', include(admin.site.urls)),
) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

我听说过,也看过资料说,这种写法不适合用在生产环境中。为什么会这样呢?

4 个回答

0

我参考了django-storages这个包的谷歌部分教程,这个教程解决了从谷歌云存储提供文件(无论是静态文件还是媒体文件,或者两者都有)的问题,这样就不需要在Nginx或类似的服务器上进行额外的配置了。

0

补充一下@Paul Draper的回答:

在使用Nginx的时候,确保你列出以下的配置:

location /media/ {
        root path/to/your/media;
}
3

不建议直接从Django服务器上提供静态文件。更好的做法是用一个单独的服务器来提供这些文件。你可以查看静态文件部署的相关内容,里面有你需要的所有信息。

13

Django是为了当“应用服务器”而设计的,而不是“网页服务器”。

换句话说,从Django提供静态文件的速度会比用Apache或Nginx差。这些静态内容服务器有两个特点:(1) 它们是用C语言写的,(2) 它们经过优化,速度很快。

而Django则是(1) 用纯Python写的,(2) 主要是为了开发应用程序而优化的。

可以查看文档了解更多信息。


这可能完全没问题。我曾经在生产环境中用Django提供静态内容,当时我知道负载不会很高,也没有提供大文件。这要看“生产环境”具体是什么样的。


顺便提一下,一个常见的生产环境设置是使用Nginx、Django、Gunicorn和Supervisor。Nginx负责从磁盘提供静态内容,并把其他请求转发给Gunicorn,后者运行多个Django实例。Supervisor则监控Gunicorn,确保它一直在运行。这一切都取决于你需要什么样的网页应用。

撰写回答