我希望Django提供一些媒体文件(例如。用户上传的文件)仅适用于登录用户。由于我的网站流量很低,我想我会保持简单,不要使用django-sendfile
来告诉Nginx什么时候提供文件。相反,我会让Django/Gunicorn来做这项工作。对我来说,这似乎简单得多,对于一个低流量的网站,这可能更安全。
但是组织文件存储位置的最佳方法是什么?媒体文件都存储在MEDIA_ROOT
下面,这个目录由Nginx在生产中提供。如果我上传我的文件到MEDIA_ROOT/protected/
,我必须告诉Nginx不要提供子目录protected
中的文件。
但这是个好主意吗?首先允许Nginx访问/media/
,然后保护子目录/media/protected/
,对我来说似乎有点风险。不使用MEDIA_ROOT
的子目录来存储受保护的文件不是更好吗?
但如果我在模型中尝试这样的快速和肮脏的东西:
upload_to='../protected/documents/%Y/%m/'
Django抱怨道:
SuspiciousFileOperation at /admin/core/document/add/
The joined path (/home/me/projects/project/protected/documents/2016/09/test.file) is located outside of the base path component (/home/me/projects/project/media)
所以我认为“离开”MEDIA_ROOT
不是一个好的做法。
存储和提供受保护媒体文件的最佳解决方案是什么?
3条答案
按热度按时间cgvd09ve1#
直接从视图提供媒体文件(可能是大文件)是不好的。你可以使用nginx服务器上提供的
sendfile
扩展;示例Nginx配置如下。将视图更改为
链接:在nginx上配置sendfile扩展名的更多细节是here
xdnvmnnf2#
我现在提出了以下解决方案:
在我的Django设置中:
在我的模型中,我可以:
或
这样,我现在有两个子目录'public'和'protected'在我的媒体文件目录。
Nginx或Djangos开发服务器只提供'public'子目录中的文件。
对于Djangos开发服务器:
对于Nginx(用于生产):
当我想提供受保护的文档时,我会执行以下操作:
在urls.py:
在views.py:
我会很感激任何评论!有没有更好的方法来实现这一点?
vd2z7a6w3#
project/urls.py
project/views.py