Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.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_Django Views_Django Urls - Fatal编程技术网

Python Django——允许用户只查看自己的页面

Python Django——允许用户只查看自己的页面,python,django,django-views,django-urls,Python,Django,Django Views,Django Urls,我正在构建的Django应用程序的开发即将结束。此应用程序中的关键视图是一个显示某种度量的用户仪表板。基本上,我不希望用户能够看到其他用户的仪表盘。现在我的观点是这样的: @login_required @permission_required('social_followup.add_list') def user_dashboard(request, list_id): try: user_list = models.List.objects.get(pk=list_

我正在构建的Django应用程序的开发即将结束。此应用程序中的关键视图是一个显示某种度量的用户仪表板。基本上,我不希望用户能够看到其他用户的仪表盘。现在我的观点是这样的:

@login_required
@permission_required('social_followup.add_list')
def user_dashboard(request, list_id):
    try:
        user_list = models.List.objects.get(pk=list_id)
    except models.List.DoesNotExist:
        raise Http404
    return TemplateResponse(request, 'dashboard/view.html', {'user_list': user_list})
url(r'u/dashboard/(?P<list_id>\d+)/$', views.user_dashboard, name='user_dashboard'),
try:
    user_list = models.List.objects.get(pk=list_id, owner=request.user)
except models.List.DoesNotExist:
    raise Http404
此视图的url如下所示:

@login_required
@permission_required('social_followup.add_list')
def user_dashboard(request, list_id):
    try:
        user_list = models.List.objects.get(pk=list_id)
    except models.List.DoesNotExist:
        raise Http404
    return TemplateResponse(request, 'dashboard/view.html', {'user_list': user_list})
url(r'u/dashboard/(?P<list_id>\d+)/$', views.user_dashboard, name='user_dashboard'),
try:
    user_list = models.List.objects.get(pk=list_id, owner=request.user)
except models.List.DoesNotExist:
    raise Http404
url(r'u/dashboard/(?P\d+/$),views.user\u dashboard,name='user\u dashboard'),

现在,任何登录用户都可以更改URL中的
列表\u id
,并访问不同的仪表板。如何使用户只查看自己列表id的仪表板,而不从URL中删除
列表id
参数?我对Django的这一部分很陌生,不知道该往哪个方向走。

只要拉一下
请求。用户
并确保这个列表是他们的

您尚未描述您的模型,但它应该是直截了当的

也许您的列表模型中存储了一个用户ID?那么,

if not request.user == user_list.user:
    response = http.HttpResponse()
    response.status_code = 403
    return response

您需要存储一些关于用户可以访问哪些列表的信息,然后将这些信息包括在用户列表查找中。让我们假设一个简单的情况,
List
有一个所有者,
User
模型有一个外键。这是列表和用户之间的多对一关系;没有列表由多个用户拥有,但一个用户可以有多个列表。然后你想要这样的东西:

@login_required
@permission_required('social_followup.add_list')
def user_dashboard(request, list_id):
    try:
        user_list = models.List.objects.get(pk=list_id)
    except models.List.DoesNotExist:
        raise Http404
    return TemplateResponse(request, 'dashboard/view.html', {'user_list': user_list})
url(r'u/dashboard/(?P<list_id>\d+)/$', views.user_dashboard, name='user_dashboard'),
try:
    user_list = models.List.objects.get(pk=list_id, owner=request.user)
except models.List.DoesNotExist:
    raise Http404
返回404还是403在某种程度上是一个意见问题;403的定义是:

如果请求方法不是HEAD,并且服务器希望公开请求未得到满足的原因,那么它应该在实体中描述拒绝的原因。如果服务器不希望将此信息提供给客户端,则可以使用状态代码404(未找到)


如果您返回404,您可以使用django快捷方式函数而不是显式的try/except-显式地执行它没有什么错,但是这种需求非常普遍,有一个方便的函数来执行它。

我使用可重用的mixin解决类似的情况。您可以通过dispatch方法的方法装饰器或视图的urlpatterns添加所需的登录名

class OwnershipMixin(object):
    """
    Mixin providing a dispatch overload that checks object ownership. is_staff and is_supervisor
    are considered object owners as well. This mixin must be loaded before any class based views
    are loaded for example class SomeView(OwnershipMixin, ListView)
    """
    def dispatch(self, request, *args, **kwargs):
        self.request = request
        self.args = args
        self.kwargs = kwargs
        # we need to manually "wake up" self.request.user which is still a SimpleLazyObject at this point
        # and manually obtain this object's owner information.
        current_user = self.request.user._wrapped if hasattr(self.request.user, '_wrapped') else self.request.user
        object_owner = getattr(self.get_object(), 'author')

        if current_user != object_owner and not current_user.is_superuser and not current_user.is_staff:
            raise PermissionDenied
        return super(OwnershipMixin, self).dispatch(request, *args, **kwargs)

什么是
列表\u id
?是某个用户的字段吗?我有一个列表和用户的联接表(愚蠢的遗留数据库)。不过,我想我有办法适应这种方法,谢谢@ChrisClouten,啊,是的,然后你会做适当的查询。这是“检查用户是否有权限”的伪代码。这起作用了。我只是记得我在另一个视图上做了类似的事情,但我就是想不出如何用跛脚的连接表来写这个。谢谢你的帮助!我最终使用了
raisepermissiondenied