我正在尝试自定义不同的权限类,但我认为,代码是95%相同。如果有可能的方法,我真的想做到这一点,以便他们可以轻松组合和调用。
假设我有两种不同的自定义权限
class IsUser1(BasePermission):
def has_permission(self, request, view):
if not request.user.is_anonymous:
try:
request.user.user1
return True
except Exception:
return False
return False
def has_object_permission(self, request, view, obj):
pass
class IsUser2(BasePermission):
def has_permission(self, request, view):
if not request.user.is_anonymous:
try:
request.user.user2
return True
except Exception:
return False
return False
def has_object_permission(self, request, view, obj):
pass
这有简单易行的方法吗?
答案 0 :(得分:1)
如果没有真正了解您正在尝试做什么,这似乎是您重构代码以消除代码重复的可能方式。
它的工作原理是has_permission
IsUser1
和IsUser2
的{{1}}实现之间的唯一差异是他们尝试访问的user
属性,所以我定义了一个每个类的公共超类型,它接受来自每个类的回调,确定它在收到的请求时尝试访问哪个属性。
from abc import abstractmethod
class BasePermission(object):
@abstractmethod
def has_permission(self, request, view):
pass
class BaseUserPermission(BasePermission):
def __init__(self, user_selector):
self.user_selector = user_selector
def has_permission(self, request, view):
if not request.user.is_anonymous:
try:
self.user_selector(request)
return True
except Exception:
return False
return False
def has_object_permission(self, request, view, obj):
pass
class IsUser1(BaseUserPermission):
def __init__(self):
super().__init__(lambda request: request.user.user1)
class IsUser2(BaseUserPermission):
def __init__(self):
super().__init__(lambda request: request.user.user2)