Django Channels框架中有没有支持的方式来编写连接到特定消费者的自定义权限?类似于DRF:
class MyConsumer(generics.APIView): permission_classes = [IsAuthenticated, MyCustomPermission] authentication_classes = [TokenAuthentication]
xfb7svmp1#
对于任何寻找解决方案的人,我想出了这个解决方案:1.使用check_permissions方法创建Permissions类。
check_permissions
Permissions
from channels.exceptions import DenyConnection class Permissions(object): permission_classes = [] def check_permissions(self): try: for permission in self.permission_classes: if permission(scope=self.scope).validate() != None: raise DenyConnection except PermissionError: raise DenyConnection
1.创建一个BasePermission类。
BasePermission
class BasePermission(object): def __init__(self, scope, *args, **kwargs) -> None: self.scope = scope def has_permission(self, *args, **kwargs) -> bool: return True def validate(self, *args, **kwargs): try: if not self.has_permission(*args, **kwargs): return PermissionError except Exception: return RuntimeError return None
1.然后用您的自定义权限重写has_perm。
has_perm
class NotAnonymousUser(BasePermission): def has_permission(self, *args, **kwargs) -> bool: try: return not isinstance(self.scope["user"],AnonymousUser) except Exception: return False
1.最后继承Permissions类并调用check_permissions方法。
class MyConsumer(Permissions, JsonWebsocketConsumer): permission_classes = [NotAnonymousUser] def connect(self): self.check_permissions() . .
1条答案
按热度按时间xfb7svmp1#
对于任何寻找解决方案的人,我想出了这个解决方案:
1.使用
check_permissions
方法创建Permissions
类。1.创建一个
BasePermission
类。1.然后用您的自定义权限重写
has_perm
。1.最后继承
Permissions
类并调用check_permissions
方法。