Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 限制用户访问Django中的不同应用_Python_Django - Fatal编程技术网

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

Python 限制用户访问Django中的不同应用,python,django,Python,Django,我的项目中有两个模型。两者都引用了User类(我使用用户模型来访问authenticate和login_required等方法) 目前,任何用户(无论是商户还是客户)都可以访问整个网站。我使用什么来限制客户到/客户url和商户到/商户url def check_if_merchant(user): try: user.__getattribute__('merchants') except AttributeError: return False

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

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

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

我尝试让用户通过测试装饰器来检查用户是否具有商家或客户属性。但它似乎会自动重定向到url.py中未设置的/accounts/Merchants等。

user\u passes\u test
只是一个简单的装饰程序,是的,它会重定向到登录url,如文档所示

现在,由于
user\u通过了\u测试
调用了您自己的测试函数,如果您想返回
403禁止的
,您只需提出
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

为什么您的模型不继承自
用户
?它们不是吗?**商户=型号。OneToOneField(用户)**不,他们没有。要继承,您需要执行
类Foo(ClassInheritFrom):
oh。。所以我假设类Foo(User.Model)比通过foriegnkey连接它们更好吗?您的类继承了
模型。模型
您可以将其更改为
用户
,然后您的
客户
商户
类的任何实例也可以访问
用户
类的所有方法和属性。谢谢!你会推荐同样的型号结构吗?或者在没有提及用户模型的情况下使用单独的商家和客户模型(如果可能的话)@Kunkka我对您的项目要求了解不够,无法推荐任何东西。在这一点上,我唯一的建议是坚持Django的命名约定:模型类名应该是单数,而不是复数(即:“Merchant”,而不是“Merchants”)。
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