问题描述
我正在开发一个 django 应用程序,用户可以在其中下载自己的文件。我需要确保文件安全,只让他们下载。
起初,我想使用类似的东西
{%if files%}
<a href='/media/files/pics/photo.png' download>
然后我意识到任何人都可以暴力破解我的网站并获取任何文件。所以我想到了通过视图处理下载。我是初学者,不知道如何制作自己的下载视图。所以我使用了类似的东西:
在views.py
def download(id):
file = data.objects.get(pk=id)
url = file.fileurl
filename = wget.download(url)
并在用户想要下载文件时调用该函数。我正在使用 wget 模块。我觉得我做错了,所以我决定征求一些建议。
最后我的问题是: 使用其他模块下载文件是错误的吗?或者如何在 Django 上编写下载视图?
谢谢!!
解决方法
如何在 Django 中下载文件取决于您的需要。任何可以下载文件并将其存储在某处的库都应该没问题。另一方面,如何为其他用户提供服务则是另一回事。
正如您所提到的,您需要将 URL 设为私有,以便只有授权用户才能下载文件。在这种情况下,您可以设置一个视图并授权用户,然后让您的网络服务器知道它应该向该用户提供特定文件。
如果您使用的是 Nginx,则可以使用 X-Accel-Redirect
。其他 Web 服务器(例如 Apache)具有名为 X-Sendfile
的类似选项。
看这里的 nginx 示例:Django and Nginx X-accel-redirect
至于保存文件,您应该将文件保存在某处并将该文件的路径存储在数据库中并将其链接到用户(例如使用外键),并且仅让文件的所有者下载该文件。还值得一提的是,下载文件可能需要很长时间,因此最好为下载文件设置一个后台任务,并允许用户在下载完成后开始下载。您可以查看 Celery 了解后台任务。