0

让我们假设我们有以下网址:

example.com/users/1

如果 ID=1 的用户打开它,用户会收到关于他的帐户的信息,但是如果用户将 1 切换为 2,那么他也可以查看其他用户的详细信息,我们当然不希望这样,所以我有以下解决方案:

1) 只需在模板中传递当前登录的用户 id 扔 request.user.id

2)添加权限,但我没有找到允许我这样做的权限类型。当然,我可以为每个用户分别创建几十个权限,但这当然是非常讨厌的方式。

还有其他想法如何在 Django 中解决这个问题吗?

4

2 回答 2

1

您可以使用请求填充上下文,以确保用户永远不会看到另一个用户的数据,例如(使用 CBV):

class AccountView(TemplateView):
    """
    Generic account view
    """
    template_name = "users/account.html"

    def get_context_data(self, **kwargs):
        context = super(AccountView, self).get_context_data(**kwargs)
        context['user'] = User.objects.get(id=self.request.user.id) 
        return context

    @method_decorator(login_required(login_url=reverse('login')))
    def dispatch(self, *args, **kwargs):
        return super(AccountView, self).dispatch(*args, **kwargs)

另一种确保“假”网址呈现 404 的方法是编写 owner_required 装饰器,例如:

def owner_required(function):
    @wraps(function)
    def decorator(*args, **kwargs):
        request = args[1]
        user = get_object_or_404(User, username=request.user.username)
        if user.is_authenticated() and user.username == kwargs.get('slug'):
            return function(*args, **kwargs)
        raise Http404
    return decorator
于 2012-09-21T10:43:47.743 回答
1

您无需获得许可即可执行此操作。在你的意见.py

from django.http import Http404

def myview(request, user_id):

  user = request.user
  if user_id != request.user.id:
      raise Http404

  #all your logic here

但是,如果您希望用户个人资料是私有的,则不需要在您的 url 模式中使用 user_id。只需使用存储在请求变量中的用户对象。

于 2012-09-21T11:03:23.570 回答