从我的Django应用程序中,我想提供安全的照片。这些照片不供公众使用,我只希望登录的用户能够查看它们。我不想依赖混淆的文件ID(给照片一个长号的UUID)并依赖于隐藏在我的媒体文件夹中的文件。如何将照片安全地存储在我的数据库中的磁盘上,并将其流式传输到经过身份验证的会话?
答案 0 :(得分:6)
使用X-Sendfile标头告诉前端服务器实际服务器的文件。
@check_permissions
def image(request):
response = HttpResponse(mimetype='image/png')
response['X-Sendfile'] = "/real/path/to/image.png"
return response
这是related question。您还可以通过查看Satchmo如何为DownloadableProduct对象提供服务来查看real world implementation。
最后一点,nginx和lighttpd使用X-Accel-Redirect和X-LIGHTTPD-send-file代替X-Sendfile。
答案 1 :(得分:2)
您可以通过使用图像的mime类型创建HttpResponse
,然后将图像文件写入/复制到其中来实现此目的。
简单版本可能如下所示:
from django.http import HttpResponse
@your_favourite_permission_decorator
def image(request):
response = HttpResponse(mimetype='image/png')
with open("image.png") as img:
response.write(img.read())
return response
另请参阅此example for PDF files和此示例PIL。
答案 2 :(得分:0)
如果它是带有mod_python的Apache服务器,这可能是一篇关于Apache using Django's authentication system的有趣文章。