让我们假设我们有以下网址:
example.com/users/1
如果ID为1的用户打开它,用户会收到有关其帐户的信息,但如果用户切换1为2,那么他也可以查看其他用户详细信息,我们当然不希望这样,所以我有以下解决方案:
1)只是将当前登录的用户ID传递给模板中的request.user.id
2)添加权限,但我没有找到允许我这样做的权限类型。当然,我可以为每个用户创建几个权限,但当然这是非常讨厌的方式。
如何处理Django中的任何其他想法?
答案 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。只需使用存储在请求变量中的用户对象。