【发布时间】:2021-10-21 15:58:45
【问题描述】:
我正在开发一个类生成器。我希望能够创建许多BasePermission 的子代,这些子代可以使用required_scopes 属性进行自定义。这是我目前所拥有的。
from rest_framework.permissions import BasePermission
class ScopedPermissionMeta(type(BasePermission)):
def __init__(self, name, bases, attrs):
try:
required_scopes = attrs['required_scopes']
except KeyError:
raise TypeError(f'{name} must include required_scopes attribute.')
required_scopes_list = ' '.join(required_scopes)
attrs['message'] = f'Resource requires scope={required_scopes_list}'
def has_permission(self, request, _view):
"""Check required scopes against requested scopes."""
try:
requested_scopes = request.auth.claims['scope']
except (AttributeError, KeyError):
return False
return all(scope in requested_scopes for scope in required_scopes)
attrs['has_permission'] = has_permission
class ReadJwtPermission(BasePermission, metaclass=ScopedPermissionMeta):
required_scopes = ['read:jwt']
但是,我不喜欢ReadJwtPermisson 类(以及更多的子类)必须指定一个元类。理想情况下,我希望将这些细节抽象掉。我希望能够做类似的事情:
class ScopedPermission(BasePermission, metaclass=ScopedPermissionMeta):
pass
class ReadJwtPermission(ScopedPermission):
required_scopes = ['read:jwt']
但在这种情况下,元类看到的是ScopedPermission,而不是required_scopes。有没有办法让元类看穿这种继承关系?
【问题讨论】: