如果我想将数据仅保留给一个用户,我应该从URL中删除用户ID吗?

时间:2012-09-21 10:29:00

标签: django django-templates

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

example.com/users/1

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

1)只是将当前登录的用户ID传递给模板中的request.user.id

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

如何处理Django中的任何其他想法?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

您无需执行此操作即可获得许可。 在你的views.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

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