Django - 如何在生产中提供用户上传的内容

时间:2014-05-21 10:21:13

标签: python django

我在Django中编写了一个小型电子商务应用程序。管理员用户将上传产品的照片。通过在urls.py

中指定以下处理程序,我在dev机器上工作了
if settings.DEBUG:
urlpatterns += patterns('django.views.static',
    (r'media/(?P<path>.*)', 'serve', {'document_root': settings.MEDIA_ROOT}),
)

在我的产品型号中,我有以下方法返回图片网址:

def detail_thumbnail_url(self) : return  self.detail_thumbnail.url

从我的模板中:

<img src="{{ product.detail_thumbnail_url }}">

到处都有警告,没有让Django在生产中处理这个问题,但是我无处可以找到如何来处理这个问题。当然有人必须这样做!

我想从运行网络应用程序的同一台服务器上提供图像。

2 个答案:

答案 0 :(得分:2)

您可能已经阅读过,建议不要采用这种方法。您必须将网络服务器与django应用程序一起使用,并通过WSGI连接它们。你基本上有三种选择......


配置和使用您的网络服务器

这意味着您需要安装一个Web服务器(建议使用Nginx)并将其与WSGI接口一起配置,例如 Gunicorn uWSGI。此选项为您提供最大的自由度,并帮助您了解工作原理。

如果您希望使用所有此配置进行本地开发并省去安装和配置的负担,则可以使用pre-baked Vagrant VMs进行开发。


使用PaaS解决方案

使用Heroku将您的应用部署到ElasticBeanstalkdocker/dokku,GAE等或您自己的PaaS(heroku式git部署)。此解决方案将为您处理大多数配置。这将节省您的时间(和金钱)。


从CDN服务

如果您通过CDN提供静态信息,无论您是deploy to PaaS还是机器,都会更好 。例如,您可以在django-s3direct之类的django应用程序的帮助下以编程方式将用户照片和媒体直接上传到AWS S3,或者使用boto制作您自己的照片...(无需重新发明轮子)。

此选项可以减轻服务器负担并加快网站速度。

答案 1 :(得分:1)

您可以通过配置您的实际服务器(Apache或其他任何服务器)来实现,无论MEDIA_URL是什么,都可以从MEDIA_ROOT的任何地方提供文件。 Django应该与它无关。