【问题标题】:How do I assign specific users to a user-uploaded file so they can modify it/delete it (Django + Apache)如何将特定用户分配给用户上传的文件,以便他们可以修改/删除它(Django + Apache)
【发布时间】:2017-02-11 19:49:59
【问题描述】:

我在 Linux 中使用 django 1.10 + Apache。 我创建了一个小型 webapp 来上传文档(使用 dropzone.js),并希望实现用户指定谁可以查看/修改/删除特定文件的能力,但我不知道如何做。我尝试使用 ManyToManyField,但我可能没有正确理解字段本身。

“文档”模型是这样的:

型号

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

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

【问题讨论】:

    标签: python django apache file-upload permissions


    【解决方案1】:

    您有一个模型和一个视图,有望用于添加新文档,但您还有许多步骤要做。 您需要一个地方来分配可以查看/修改/删除文件的用户。如果您需要存储访问级别(查看/删除...),您的 access_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
    

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

    【讨论】:

    • 我不好。我已经有了可以修改和删除文档的视图。我的问题是如何为每个单独的文件分配用户权限,以便可以根据这些文件修改/删除它们。
    • 您可以通过管理员快速将用户分配给文档。来自模型的 access_by 的用户权限似乎表明您想要拥有文档,并说这个并且该用户可以访问它。
    • 是的。这正是我想要的。如果它可以与权限框架一起使用,我认为它可能会更好,通过尝试您编辑的方法。
    猜你喜欢
    • 2020-11-01
    • 2019-05-27
    • 2018-11-17
    • 1970-01-01
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    • 2013-04-01
    • 2010-10-07
    相关资源
    最近更新 更多