限制用户访问Django中的不同应用程序

时间:2015-07-08 11:42:28

标签: python django

我的项目中有两个模型。两者都引用了User类(我使用User模型来访问authenticate和login_required等方法)

class Customer(models.Model):
    Customer = models.OneToOneField(User)
    CustomerID = models.CharField(max_length = 15)
    phone_regex = RegexValidator(regex = r'\d{10}', message = 'Enter your 10 digit Mobile number')
    Phone_no = models.CharField(max_length = 10,validators = [phone_regex],blank = True)
    Customer_wallet = models.IntegerField(default = 100)


class Merchants(models.Model):
    merchant = models.OneToOneField(User)
    MerchantID = models.CharField(max_length = 15)
    Storename = models.CharField(max_length = 25)

目前,任何用户(无论他是商家还是客户)都可以访问整个网站。我如何使用什么来限制客户/客户网址和商家到/商家网址?

def check_if_merchant(user):
    try:
        user.__getattribute__('merchants')
    except AttributeError:
        return False

我尝试了user_passes_test装饰器来检查用户是否有商家或客户属性。但它似乎会自动重定向到/ accounts / Merchants等,这些都没有在urls.py中设置。

1 个答案:

答案 0 :(得分:3)

user_passes_test只是一个简单的装饰器,是的, 重定向到登录网址。

现在,由于user_passes_test会调用您自己的测试函数,如果您想要返回403 Forbidden,则只需要引发PermissionDenied而不是返回False

from django.core.exceptions import PermissionDenied, ObjectDoesNotExist

def check_if_merchant(user):
    try:
        user.merchants
    except (AttributeError, ObjectDoesNotExist):
        raise PermissionDenied
    else:
        return True

或者,您可以先检查您是否有登录用户,如果没有,则返回False,将未登录的用户重定向到登录页面:

from django.core.exceptions import PermissionDenied, ObjectDoesNotExist

def check_if_merchant(user):
    if user.is_anonymous():
        return False
    try:
        user.merchants
    except (AttributeError, ObjectDoesNotExist):
        raise PermissionDenied
    else:
        return True