使用Django:如何提供文件下载?

时间:2015-11-25 22:29:20

标签: python django class-based-views

首先我要说的是,我已经花了很多精力,而且此时任何输入对我都非常有价值。现在,问我的问题:

我的工作内容:我的网站为用户提供了一个简单的界面,供用户上传一个文件,在该文件中,他们将获得一个密钥。该文件将保存到服务器,并使用现代安全加密算法生成密钥。这些细节对于手头的问题并不重要。

我想要实施的内容:在下载页面上,用户可以输入密钥,文件将下载到他们的计算机上。想要知道的是如何为用户提供下载上传文件的能力。简单来说,我只想让用户下载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的。如果我投入生产,我会考虑其他选择。无论发布什么代码,我都可以发帖。

谢谢!

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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

答案 2 :(得分:0)

除了我在原始问题中显示的url文件外,我需要做的就是提供一个HttpResponseRedirect(&#39; / path / of / my / media / file&#39;)

很简单!