如何在Django中对用户上传的文件应用读/写权限

时间:2016-10-04 19:24:52

标签: python django authentication permissions

我有一份"文件" model,使用dropzone.js和register / login的上传系统。我现在迷失了如何将权限应用于每个上传的文件,因此只有指定的用户才能访问它们。

基本上: File1-> accessible_by = user1,user2

File2-> accesible_by =用户3,... USER5

等等。

感谢任何人就我的问题提供建议/帮助。

使用相关代码进行编辑:

创建文档视图:

class DocumentCreate(CreateView):
    model = Document
    fields = ['file', 'is_public']

    def form_valid(self, form):
        self.object = form.save()
        data = {'status': 'success'}
        response = JSONResponse(data, mimetype =
        response_mimetype(self.request))
        return response

我在视图上做了以上处理dropzone.js文件上传。

这是我的"文件"模型

class Document(models.Model):

    file = models.FileField(upload_to = 'files/')
                                #validators=[validate_file_type])
    uploaded_at = models.DateTimeField(auto_now_add = True)
    extension = models.CharField(max_length = 30, blank = True)
    thumbnail = models.ImageField(blank = True, null = True)
    is_public = models.BooleanField(default = False)

    uploaded_by = models.ForeignKey(User,
                                related_name='uploadedByAsUser', null=True)

    allowed_users = models.ManyToManyField(User,
                                related_name='allowedUsersAsUser')

    def clean(self):
        self.file.seek(0)
        self.extension = self.file.name.split('/')[-1].split('.')[-1]
        if self.extension == 'xlsx' or self.extension == 'xls':
            self.thumbnail = 'xlsx.png'
        elif self.extension == 'pptx' or self.extension == 'ppt':
            self.thumbnail = 'pptx.png'
        elif self.extension == 'docx' or self.extension == 'doc':
            self.thumbnail = 'docx.png'


    def delete(self, *args, **kwargs):
        #delete file from /media/files
        self.file.delete(save = False)
        #call parent delete method.
        super().delete(*args, **kwargs)

    #Redirect to file list page.
    def get_absolute_url(self):
        return reverse('dashby-files:files')

    def __str__(self):
        return self.file.name.split('/')[-1]

    class Meta():
        ordering = ['-uploaded_at']

2 个答案:

答案 0 :(得分:0)

您可以在文档模型中添加Export-Csv字段,以便只有指定的用户才能访问这些文件。例如:

#TYPE System.Management.Automation.PSCustomObject

这样,如果您希望将用户添加到"允许"列表,您可以使用以下内容添加它们:

allowed_user

然后让管理员看起来很好(admin.py):

class Document(models.Model):
    file = FileField()
    uploaded_by = models.ForeignKey(User, related_name='uploadedByAsUser')
    allowed_users = models.ManyToManyField(User, related_name='allowedUsersAsUser')

然后,如果您想检查是否允许,您可以执行以下操作:

class DocumentCreate(CreateView):
    model = Document
    fields = ['file', 'is_public']

    def form_valid(self, form):
        self.object = form.save(commit=False)
        self.object.allowed_users.add(request.user)
        self.object.save()
        data = {'status': 'success'}
        response = JSONResponse(data, mimetype =
        response_mimetype(self.request))
        return response

答案 1 :(得分:0)

您可以在HttpResponse上设置content_type。因此,您可以在视图中进行权限处理,并直接从Django提供文件:

return HttpResponse("Text only, please.", content_type="text/plain")

注意:Django不是一个Web服务器。建议使用Web服务器来提供静态文件!

如果您处理少量数据并且仅偶然提供数据,则上述方法可能是一种很好的方法。如果您需要强大的解决方案,则需要检查Django中的权限并将数据服务留给Web服务器。

  • Lighthttpd X-Sendfile
  • Apache mod_wsgi内部重定向
  • NGNIX X-Accel-Redirect

查看Django文件流包:https://djangopackages.org/grids/g/file-streaming/