python - 使用 Django : How to serve a file for download?

标签 python django django-class-based-views

首先让我说我在这方面花费了很多精力,此时任何意见对我来说都非常有值(value)。现在,回到我的问题:

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

我要实现的内容:在下载页面上,用户可以输入 key ,文件就会下载到他们的计算机上。我想知道的是如何为用户提供下载上传文件的能力。简单的说,就是让用户可以下载MEDIA_ROOT文件夹下的一个文件。

我正在使用基于类的 View ,所以我的网址是:

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)

请提供我应该在我的 View 中使用哪些函数来实际下载文件的基本概念。我仍在开发中,所以我想利用 Django 的文件服务能力,而不是 Apache 的。如果我投入生产,我会考虑其他选择。无论我需要发布什么代码,我都可以发布。

谢谢!

最佳答案

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

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

关于python - 使用 Django : How to serve a file for download?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33927545/

相关文章:

python - 如何使用 shuffle_batch() 函数避免超出范围错误?

django - 开始 : Job failed to start UWSGI,

python - Django 装饰器根据用户类型进行重定向

Django self.request 未解析的属性(登录)

python - 无法将查询结果分配给 python 变量

python - flake8:仅忽略整个文件中的 F401 规则

python - 用于大量文件的 Django 文件系统存储

python - 大写查菲尔德

django - Django 中基于类的 View 的身份验证

python - mixin 的顺序如何影响派生类?