Разрешение на класс некоторых полей метода ViewSet фреймворка Django rest
Я хотел получить разрешение AllowAny
только для функции retrieve
. В моем ViewSets.
class PostLanguageViewSet(viewsets.ViewSet):
permission_classes = (permissions.AllowAny,)
permission_classes_per_method = {
"retrieve": permission_classes
}
def retrieve(self, request, post_id=None, post_language_id=None, *args, **kwargs):
...
def destroy(self, request, post_id=None, post_language_id=None, *args, **kwargs):
...
def update(self, request, post_id=None, post_language_id=None, *args, **kwargs):
...
- этот метод разрешает все разрешения функций
AllowAny
.
Для этого вы можете использовать декоратор действий, который переопределит разрешения и многое другое.
class PostLanguageViewSet(viewsets.ViewSet):
permission_classes = [permissions.AnyOtherPermissionForOtherMethods]
@action(
methods=("GET",),
url_path="get-language",
url_name="get-language",
detail=True,
permission_classes=[
permissions.AllowAny],
)
def retrive_language(self, request, post_id=None, post_language_id=None, *args, **kwargs):
#Your Code
def destroy(self, request, post_id=None, post_language_id=None, *args, **kwargs):
...
def update(self, request, post_id=None, post_language_id=None, *args, **kwargs):
...
````
попробуйте это
class PostLanguageViewSet(viewsets.ViewSet):
def get_permissions(self):
if self.request.method == 'GET':
return [permissions.AllowAny()]
else:
return super().get_permissions()
Если вы хотите уточнить действие, а не метод. Вы можете проверить действие и применить разрешение соответствующим образом.
class PostLanguageViewSet(viewsets.ViewSet):
def get_permissions(self):
if self.action == 'retrieve':
return [permissions.AllowAny()]
return super().get_permissions()