我为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)