如何在django装饰器中访问参数值表单url

时间:2014-11-04 09:55:51

标签: python django python-decorators

我想制作装饰器,阻止用户查看其他个人资料,但可以查看自己的个人资料。如果用户的id已在url中传递为http://example.com/user/?id=5,我想在我的django装饰器中获取值id = 5。我怎么能得到它的任何一个例子?

def admin_or_ownership_required(owner):
    def check_admin_or_owner(user):
        # pk = request.GET.get('pk', None)
        # if pk is not None and pk == user.id:
        #     return True
        if owner == 'Account':
            if user.is_superuser or (user.is_active and (user.role == 'admin' or user.role == 'owner')):
                return True
            else:
                return False
        elif owner == 'User':
            if user.is_superuser or (user.is_active and (user.role == 'admin' or user.role == 'owner')):
                return True
            else:
                return False
        else:
            return False
    return user_passes_test(check_admin_or_owner)

这是我的观看代码

class AccountDetailView(DetailView):
    template_name = 'api/account_detail.html'
    model = Account

    @method_decorator(admin_or_ownership_required('Account'))
    def dispatch(self, *args, **kwargs):
        return super(AccountDetailView, self).dispatch(*args, **kwargs)

如何在admin_or_ownershipl_required装饰器

中使用request参数

3 个答案:

答案 0 :(得分:0)

def check_login(method):
   @functools.wraps(method)
   def wrapper(request, *args, **kwargs):
       if request.GET['id'] == request.user.id
           # Give your redirect url
      return method(request, *args, **kwargs)
   return wrapper

答案 1 :(得分:0)

您可以在视图中使用mixin,限制案例查询集,例如:

class MixinRestrictedAccount(object):
    def get_queryset(self):
        return Account.objects.filter(id=self.request.user.id)


class AccountDetailView(MixinRestrictedBox, DetailView):
    [..]

答案 2 :(得分:0)

尝试转储kwargs的值,从那里你可以访问url参数。例如 : 如果你有像Url这样的网址:

/users/(?P<username>\w+)/$

您可以通过kwargs参数访问该值,该参数在装饰器方法中传递。您可以通过以下方式访问:

kwargs.get("username")

如果您想通过GET方法访问url参数,那么您可以尝试这样:

request.GET.get("username")

表示URL:

/users/?username=dominic

谢谢。