Как получить доступ к методу, украшенному декоратором @action представления, унаследованного от класса APIView, в файле urls.py в DRF?
Мне нужно применить различные разрешения к различным методам моего класса View, который наследуется от APIView в приложении DRF. Для достижения этой цели я использую декоратор @action для методов класса View.
Вот код views.py
class UserView(APIView):
@action(methods=['post'], detail=False, permission_classes=[AllowAny])
def create(self, request):
serializer = UserRegSerializer(data=request.data)
user_service = UserService()
try:
serializer.is_valid(raise_exception=True)
serialized_data = serializer.validated_data
registered_user = user_service.create_user(serialized_data)
payload = registered_user.__dict__
response = ResponseGenerator(payload, constants.SUCCESS_KEY)
except Exception as e:
response = ResponseGenerator(e)
return Response(data={"Response": response.get_custom_response()})
Я не понимаю, как я могу получить доступ к этому методу в моем файле urls.py по шаблону '/user', вот мой код urls.py.
urlpatterns = [
path('user', UserView.as_view()),
]
Я использовал ChatGPT для ответа на этот вопрос. Он предложил несколько способов использования объекта словаря, переданного {'post':'create'} в методе as_view() View в urls.py следующим образом.
urlpatterns = [
path('user', UserView.as_view({'post':'create'})),
]
В нем мне было сказано, что key словаря должен быть http метод, используемый для доступа к этому методу по шаблону url, а value словаря должен быть методом, к которому вы хотите получить доступ по данному url.
Но он не работает, и выдает мне следующую ошибку, когда я пытаюсь запустить свой проект после написания этого кода в моем urls.py
TypeError: APIView.as_view() принимает 1 позиционный аргумент, но было задано 2
Я не нашел никакого решения для решения проблемы, с которой я столкнулся, нигде в интернете и в документации django также.
Я рекомендую вам использовать Generic(Some Method)APIView. Потому что он может быть изменен на что-то хорошее для масштабируемости и надежности вашего кода.
- Используйте
CreateAPIView
, вам не нужен декоратор для базовой функции создания.
# views.py
class UserRegView(CreateAPIView):
serializer_class = UserRegSerializer
permission_classes = [AllowAny]
- Если вам нужна валидация, пишите в функции validate. Ваш Response может быть изменен. Тогда, вы должны изменить вы .
# serializers.py
class UserRegSerializer(serializers.Serializer):
somefield_1 = serializers.CharField()
somefield_2 = serializers.CharField()
newfield_1 = serializers.IntegerField(read_only=True) # example
def validate(self, attrs):
a = attrs["somefield_1"]
if a != "otherthing":
raise ValidationError({"error": "Your error description some case"})
return attrs
def create(self, validated_data):
instance = UserReg.objects.create(**validated_data)
# Make Logic for instance or just validated_data or custom response whatever you want.
# If you want to custom response, could write like this simple example.
return {
"somefield_1": "test1",
"somefield_2": "test1",
"newfield_1": "test1",
}
- Теперь вам не нужен никакой аргумент в as_view().
# urls.py
urlpatterns = [
path("user_new", UserRegView.as_view()),
]