如何将特定用户分配给用户上传的文件,以便他们可以修改/删除它(Django + Apache)

时间:2016-10-03 19:16:34

标签: python django apache file-upload permissions

我在Linux中使用django 1.10 + Apache。 我已经创建了一个小的webapp来上传文档(使用dropzone.js),并希望实现用户指定谁可以查看/修改/删除特定文件的能力,但我无法弄清楚如何。我尝试使用ManyToManyField,但也许我没有正确地理解Field本身。

“文档”模型是这样的:

模型

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)
    accesible_by = models.ManyToManyField(User) #This is my attempt at doing this task.

    def clean(self):
        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']

我的视图处理文档的创建:

查看

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

    def form_valid(self, form):
        self.object = form.save(commit = False)
        ## I guess here i would Add the (self.request.user) to the accesible_by Field.
        self.object.save()
        data = {'status': 'success'}
        response = JSONResponse(data, mimetype =
        response_mimetype(self.request))
        return response

提前感谢任何人提出任何想法或建议......

1 个答案:

答案 0 :(得分:0)

您有一个模型和视图,希望能够用于添加新文档,您仍然需要执行许多步骤。 您需要一个位置来分配可以查看/修改/删除文件的用户。如果您需要存储访问级别(查看/删除...),则您的accessible_by不够用,并且您可以使用 through 表格添加更多信息,例如访问级别。

您需要为各种操作编写视图,例如查看,删除...用户将请求,并在此确保用户具有正确的权限。实现将获取request.user和文档ID,查看用户是否具有她正在做什么的权限,返回http未授权的异常或允许该操作继续。

  

编辑:我的问题是如何为每个人分配用户权限   个人档案

如果我们通过django级别保持访问控制权限,使用您已有的文档模型,并且您已经采取了一些步骤,并且对于每个文档,您都可以分配用户(accessible_by)。这样的事情可以让你开始:

from django.core.exceptions import PermissionDenied
def view_document(request, doc_pk):
    doc = get_object_or_404(Document, pk=doc_pk)
    if not doc.accessible_by.filter(username=request.user.username):
        raise PermissionDenied
    #perform rest of action

或者您的意思是使用权限框架本身吗?