Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django用户权限/视图?_Python_Django_Views - Fatal编程技术网

Python Django用户权限/视图?

Python Django用户权限/视图?,python,django,views,Python,Django,Views,我使用的是Django基于类的视图 views.py class ReportListView(LoginRequiredMixin, ListView): model = Report def get_queryset(self): queryset = Report.objects.filter(user=self.request.user) return queryset class ReportDetailView(LoginRequ

我使用的是Django基于类的视图

views.py

class ReportListView(LoginRequiredMixin, ListView):
    model = Report

    def get_queryset(self):
        queryset = Report.objects.filter(user=self.request.user)
        return queryset


class ReportDetailView(LoginRequiredMixin, DetailView):
    model = Report


class ReportUpdateView(LoginRequiredMixin, UpdateView):
    model = Report


class ReportCreateView(LoginRequiredMixin, CreateView):
    model = Report


class ReportDeleteView(DeleteView):
    model = Report
如您所见,这些是最通用的视图,但它们都应该只表示当前用户的数据

目前,任何用户都可以查看其他用户的数据

我看到的一种方式是,人们会定义他们的get_queryset方法,如上所述。这种方法只过滤呈现的数据,但用户仍然可以通过url访问被禁止的数据(前提是他知道/猜测id)


如何限制对其他用户资源的访问?

我已经找到了答案。我创建了一个Mixin,其中queryset根据用户进行评估

class BaseMixin(object):    
    def get_queryset(self):
        return DnevnaBiljeska.objects.filter(igrac=self.request.user.igrac)

class ReportListView(LoginRequiredMixin, BaseMixin, ListView):
    model = Report

这样,我就可以对每个视图单独调用super进行进一步的查询集筛选。

在访问任何视图之前,请确保当前用户是所查看实例的所有者

class ReportDetailView(LoginRequiredMixin, DetailView):
    model = Report

    def get_object(self,queryset=None):
        obj = super(Report, self).get_object(queryset=queryset)
        if obj.user != self.request.user:
            raise Http404
        return obj

您必须自己实施访问控制。django如何知道允许哪些用户访问?除了内置的身份验证组和权限之外,还有一些扩展提供这种功能。我想到了Django guardian。在访问任何视图之前,请确保当前用户是所查看实例的所有者使用此vs get_queryset有什么好处?get\u queryset在细节/更新/删除视图上的工作方式与get\u对象完全相同,django会自动引发404。我认为
get\u query\u set()
要处理对象列表,需要确定要显示的对象列表,而get\u对象只需要从db中获取对象。在您的情况下,更新、删除、查看应使用
get\u object()