我正在尝试实现对文件的安全访问。这是我提供静态文件的视图:
from django.views.static import serve
class ServeStatic(LoginRequiredMixin, View):
login_url = reverse_lazy("login")
def dispatch(self, request, *args, **kwargs):
if request.user == Document.objects.get(url=self.kwargs["path"]).owner:
return serve(request, kwargs["path"], kwargs["file_root"])
else:
return HttpResponseNotFound()
关键是我不能让条件起作用。是否可以通过其URL获取文件,或者我需要选择一种非常不同的文件服务方法?
我的文档模型:
class Document(models.Model):
owner = models.ForeignKey(settings.AUTH_USER_MODEL,
verbose_name=_("Owner"), related_name="owner")
document = models.FileField(upload_to=file_upload_handler, verbose_name=_("Document"))
感谢您的想法!
答案 0 :(得分:1)
首先,我将传递给dispatch
已清理的数据(验证后)。我不是说你不是那样做的。接下来,我不会使用文件路径的相同部分来定位您的机器上的文件,因为它在url中。如果您使用的是Document
模型,那么您可以将网址更改为不会对文档进行任何说明的内容。让我们说甚至uuid:
import uuid
print uuid.uuid4().get_hex() # python 2.7
print (uuid.uuid4().hex) # python 3.x
根据uuid发送的url我会在我的数据库中搜索正确的文件:
class Document(models.Model):
owner = models.ForeignKey(settings.AUTH_USER_MODEL,
verbose_name=_("Owner"), related_name="owner")
uid = models.CharField(max_length=32, null=False)
document = models.FileField(upload_to=file_upload_handler, verbose_name=_("Document"))
然后您可以使用:
进行查询class ServeStatic(LoginRequiredMixin, View):
login_url = reverse_lazy("login")
def dispatch(self, request, *args, **kwargs):
doc = Document.objects.get(uid=self.kwargs["uid"],
owner=request.user):
return serve(request, doc.document, kwargs["file_root"])
else:
return HttpResponseNotFound()
希望有所帮助。