2012-09-21 33 views
0

就讓我們假設我們有以下網址:如果我想只保留一個用戶的數據,我應該從URL中刪除用戶標識嗎?

example.com/users/1 

如果與ID = 1的用戶打開它,用戶收到有關他的帳戶信息,但如果用戶切換1與2,那麼他就可以查看其他用戶的細節好了,我們當然不希望這樣,所以我有以下解決方案:

1)目前只是通過登錄的用戶ID扔request.user.id模板

2)添加權限內,但我沒有找到允許我這樣做的權限類型。當然,我可以爲每個用戶創建數十個權限,但當然這是非常討厭的方式。

任何其他想法如何應對在Django?

回答

1

您可以爲請求填充上下文,以確保用戶永遠不會看到其他用戶的數據,例如, (使用CBVS):

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) 

另一種方法,以確保「假」的URL顯示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

你不需要的權限做到這一點。 在你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 

但是如果你想用戶配置文件是私有的,你不需要在你的URL模式使用USER_ID。只需使用存儲在請求變量中的用戶對象即可。

相關問題