【发布时间】:2017-11-17 21:09:25
【问题描述】:
有没有办法使某些文件无法通过直接 url 访问?例如,图像出现在页面上,但图像位置不能单独使用。
【问题讨论】:
有没有办法使某些文件无法通过直接 url 访问?例如,图像出现在页面上,但图像位置不能单独使用。
【问题讨论】:
事情的正常运作方式 默认情况下,所有静态和媒体文件都从静态根和媒体根文件夹提供。一个好的做法是让 NGINX 或 Apache 路由到这些,或者使用 Django Whitenoise 之类的东西来提供静态文件。
在生产环境中,您绝对不希望 runserver 提供这些文件,因为 1) 这不能很好地扩展,2) 这意味着您在生产环境中以 DEBUG 模式运行,这是绝对不允许的.
保护这些文件 您可以为大多数不需要保护的文件保留此配置。相反,您可以在 Django 中从不同的文件路径提供您自己的文件。使用文件字段的upload_to 参数来指定您希望这些文件存在的位置。例如,
protectedfile = models.FileField(upload_to="protected/")
publicfile = models.FileField(upload_to="public/")
然后在 NGINX 中将您的块直接指向 /var/www/myproject/MEDIAROOT/public。这将使您能够继续提供公共文件。
同时,对于受保护的文件,视图可以通过以下方式提供这些文件:
def view_to_serve_up_docs(request, document_id):
my_doc = MyDocumentModel.objects.get(id=document_id)
# Do some check against this user
if request.user.is_authenticated():
response = FileResponse(my_doc.privatefile)
response["Content-Disposition"] = "attachment; filename=" + my_doc.privatefile.name
else:
raise Http404()
return response
并在您的模板中链接到此视图
<a href='/downloadFileView/12345'>Download File #12345 Here!</a>
参考 有关 FileResponse 对象的更多信息:https://docs.djangoproject.com/en/1.11/ref/request-response/#fileresponse-objects
【讨论】: