在 Django 开发中,如何提供用户上传的文件?

3
这可能是一个愚蠢的问题,但文档中说:

Serving files uploaded by a user during development.¶

During development, you can serve user-uploaded media files from MEDIA_ROOT using the django.contrib.staticfiles.views.serve() view.

This is not suitable for production use! For some common deployment strategies, see Deploying static files.

For example, if your MEDIA_URL is defined as /media/, you can do this by adding the following snippet to your urls.py:

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)

这是否意味着在生产环境中不应使用+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT),还是应该使用?

我的理解是,您不应使用django.contrib.staticfiles.views.serve(),但我不确定是否相同。

2个回答

5

django.contrib.staticfiles.views.serve()不应用于部署。

首先,在任何地方调用views.serve()只有在DEBUG = True时才会起作用,如果在部署应用程序时使用DEBUG = False,则会引发Http404。然而,在开发中使用它的好处在于,您无需运行collectstatic/收集静态文件:您可以从静态或媒体根目录中提取它们,而无需移动文件。

它也有一定的不安全性:views.serve()将使用mimetype模块猜测其所服务的文件的内容类型,这将依赖于您正在开发的平台的映射文件:由于特定环境中的mimetype模块,生产中的行为可能不同。

文档详细介绍了有关django.contrib.staticfiles.views.serve()的信息。

现在,当涉及到生产时,为您提供静态/媒体文件并不是Django的WSGI所擅长的。 Django编写用于提供应用程序内容,并且在提供静态/用户上传的内容时性能不佳。 如果您期望中等负载甚至更高,则使用单独的服务器(如ApacheNginx)与诸如uWSGI之类的Web服务器结合使用,可以更加可持续并且可以处理更多内容。 此文档详细介绍了如何设置这些内容/解释更多信息。


2
在生产环境中,应该将Debug = False。这样做后,Django将不再提供静态文件服务。
一个流行的替代方法是使用Amazon的S3 Bucket。举个例子,假设您创建了一个新的Bucket。您的MEDIA_URL可能如下所示: MEDIA_URL = 'bucket.s3.amazonaws.com/media' 你可以以相同的方式提供静态文件。
这回答了你的问题吗?

我想是这样,谢谢!我想我只需要经历那个过程一次。 - Tom

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