Django - 通过其URL

时间:2016-08-24 18:12:19

标签: python django

我正在尝试实现对文件的安全访问。这是我提供静态文件的视图:

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"))

感谢您的想法!

1 个答案:

答案 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()

希望有所帮助。