mypy django Rest 框架 - 使用多个权限类时不支持左操作数类型

问题描述 投票:0回答:1

我正在将 mypy 集成到现有代码库上(使用 django、drf 框架)。

view.py 中的示例代码:

from rest_framework.permissions import IsAdminUser, IsAuthenticatedOrReadOnly

@api_view()
@permission_classes([IsAuthenticatedOrReadOnly | IsAdminUser])
def listAbc(request):
    queryset = ...
    serializer = ...
    return Response(serializer.data)

结果:

$ mypy
error: Unsupported left operand type for | ("Type[IsAuthenticatedOrReadOnly]")

使用的插件:

$ pip list | grep stubs
django-stubs                    1.2.0
djangorestframework-stubs       1.0.0

mypy 配置文件(mypy.ini):

[mypy]

plugins =
    mypy_django_plugin.main, mypy_drf_plugin.main

;ignore_missing_imports = True
files=**/*.py

[mypy-*.migrations.*]
ignore_errors = True

[mypy.plugins.django-stubs]
django_settings_module = project.settings

使用 mypy(0.720 和 0.740)进行检查。

这可能是什么问题? 由于操作'|' mypy 无法识别,我怀疑在 mypy 评估期间未添加元类 BasePermissionMetaclass (包含操作) BasePermission。我认为只需安装 djangorestframework-stubs 并在 mypy.ini 中配置相同的内容就足够了。

python django mypy typeshed django-stubs
1个回答
0
投票

问题是因为 mypy 不理解 Django Rest 框架中两个权限类之间使用的

|
运算符。这是 Django 和 DRF 的 mypy 和类型存根的限制,至少到目前为止(可能有一天会得到解决)。

DRF 的 BasePermission 类中重载了

|
运算符,表示
"or"
,允许组合多个权限,但是 mypy 无法识别此运算符重载,因此出现错误!

您可以创建一个封装两个权限类逻辑的自定义权限类,而不是使用

|
运算符。例如:

from rest_framework.permissions import BasePermission, IsAdminUser, IsAuthenticatedOrReadOnly

class CustomPermission(BasePermission):
    def has_permission(self, request, view):
        return IsAuthenticatedOrReadOnly().has_permission(request, view) or IsAdminUser().has_permission(request, view)

@api_view()
@permission_classes([CustomPermission])
def listAbc(request):
    queryset = ...
    serializer = ...
    return Response(serializer.data)

这个问题好像是4年前的事了,刚刚发现并认为这可能对搜索它的人有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.