2015-11-25 63 views
2

让我先说我在这方面花了很多精力,任何投入对我来说都非常有价值。现在,我的问题:使用Django:如何提供文件下载?

我有什么工作:我的网站提供了一个简单的界面,供用户上传文件,他们将被给予一个关键。该文件被保存到服务器,密钥是使用现代,安全的加密算法生成的。这些细节对于手头的问题并不重要。

我想实现的内容:在下载页面上,用户可以输入密钥并将文件下载到他们的计算机上。想要知道的是如何为用户提供下载上传文件的能力。简而言之,我只想让用户在MEDIA_ROOT文件夹下载一个文件。

我使用基于类的意见,所以我的网址是:

urls.py

from django.conf.urls import patterns, include, url 
from django.conf.urls.static import static 
from django.conf import settings 
from fileupload.views import FileDownloadView, GetFileView 

urlpatterns = patterns('', 
    url(r'^key/?$', FileDownloadView.as_view(), name='getkey'), 
    url(r'^download/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}, GetFileView.as_view()), 
) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 

请为我提供,我应该在我的观点使用何种功能的基本思路实际上下载文件。我仍在开发中,所以我想利用Django提供文件的能力,而不是Apache的。如果我投入生产,我会考虑其他选择。无论我需要发布什么代码,我都可以发布。

谢谢!

+0

为什么不使用nginx来处理所有静态文件? –

+0

你好,我很抱歉,我忘了提及我正在使用Apache。我添加了一个编辑来阐明我想利用Django提供文件的能力。 – Chuck

回答

1

如果密钥授予他们访问文件的权限,为什么不把密钥设置为文件名?也就是说,当文件上传时,创建一个长键(比如说64个字符)并将文件重命名为键名。当请求时,只需使用static.serve方法提供该文件即可。

这种方法的好处是:1)您不需要将密钥映射到数据库中的文件,以及2)在检索文件时不需要验证密钥。如果找到文件名,则密钥有效。

+0

嗨布伦特, 我绝对是这样做的!它确实使这个过程变得更容易。我不知道的是如何使用这个static.serve方法来提供文件。你能提供一个如何使用这个函数的例子吗?谢谢。 – Chuck

+0

也许这将帮助:http://stackoverflow.com/a/9825550/584846 –

+0

我以前找到这篇文章,并已相应地设置了一切,但是,该文章是缺少什么方法,我需要使用我的信息观点。 – Chuck

0

基本上我告诉过你,Django不应该在生产中提供文件。是

后,它可能是:

你可以成为一个文件树django.conf.urls.static.static(),如您urls.py视图。例如:

urlpatterns = patterns('', 
    ... 
    static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 
    ... 
) 

或者使用whitenoise,一包与Python Web应用程序服务器的静态文件。这是非常简单易用,只改变你的wsgi.py文件是这样的:

from django.core.wsgi import get_wsgi_application 
from whitenoise.django import DjangoWhiteNoise 

application = get_wsgi_application() 
application = DjangoWhiteNoise(application) 

而且使用'whitenoise.django.GzipManifestStaticFilesStorage'STATICFILES_STORAGE

0

随着我在原来的问题显示的URL文件,所有我需要在这里做的是提供一个HttpResponseRedirect(“/路径/ /我的/媒体/文件”)

很简单!