设置自定义DEFAULT_METADATA_CLASS时发生AttributeError

时间:2019-01-11 12:16:53

标签: django django-rest-framework

我为OPTION请求编写了一个自定义元数据类。此类位于myproject.api.metadata.py中,称为PermissionsMetadata。

在单个视图上,我可以设置metadata_class = PermissionsMetadata,它可以正常工作。但是,在我的设置中设置 DEFAULT_METADATA_CLASS 时,如下所示:

REST_FRAMEWORK = {
    'DEFAULT_METADATA_CLASS': 'api.metadata.PermissionsMetadata',
    ...
}

...运行任何测试时,我得到以下信息:

  

ImportError:无法导入   API设置的“ api.metadata.PermissionsMetadata”   'DEFAULT_METADATA_CLASS'。 AttributeError:模块   “ rest_framework.views”没有属性“ APIView”。

我只需要默认情况下将元数据类应用于所有视图,而不必在每个视图上都设置metadata_class属性。我不介意将课程转移到其他地方。

顺便说一句,将默认元数据类设置为 rest_framework.metadata.SimpleMetadata 不会导致此异常。

非常感谢您的帮助。

代码:

from rest_framework.metadata import BaseMetadata

from users.models import User


class PermissionsMetadata(BaseMetadata):
    versioned_view_attributes = {
        'get': 'get_permissions_required',
        'patch': 'patch_permissions_required',
        'delete': 'delete_permissions_required',
        'post': 'post_permissions_required',
        'put': 'put_permissions_required',
    }

    def determine_metadata(self, request, view):
        response = {}

        user: User = request.user
        obj = view.get_object_without_checking_permissions()

        for key in self.versioned_view_attributes.keys():
            response.update({key: self.has_permission(user, obj, view, key)})

        return response

    def has_permission(self, user: User, obj, view, method: str):
        attribute_name = self.versioned_view_attributes.get(method, None)
        if not attribute_name:
            return False

        permission_required = getattr(view, attribute_name)

        return user.has_perm(permission_required, obj)

0 个答案:

没有答案