django 如何在DRF中访问从www.example.com文件中的APIView类继承的视图的用@action装饰器装饰的方法urls.py?

hjzp0vay  于 2023-01-21  发布在  Go
关注(0)|答案(1)|浏览(133)

我需要在我的View类的不同方法上应用不同的权限,这个类是从DRF应用程序中的APIView继承的。为了实现这个目的,我在我的View方法上使用@action装饰器。
下面是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()})

我不明白我怎么能在我的www.example.com文件中访问这个方法urls.py来对抗模式'/user',这是我的urls.py代码。

urlpatterns = [
    path('user', UserView.as_view()),
]

我使用ChatGPT来回答我的这个查询。它建议了一些方法来使用在www.example.com中View的as_view()方法中传递的{'post':'create'}字典对象urls.py,如下所示。

urlpatterns = [
    path('user', UserView.as_view({'post':'create'})),
]

在这里它告诉我字典的key应该是http方法,用来访问url模式的方法,字典的value应该是你想要访问的url模式的方法。
但它不工作,并给我以下错误,当我试图开始我的项目后,写这段代码在我的urls.py
TypeError:APIView.as_view()接受1个位置参数,但实际给出了2个
我没有找到任何解决方案来解决我在互联网上和django的文档中遇到的问题。

niwlg2el

niwlg2el1#

我建议你使用泛型(一些方法)APIView,因为它可以被修改成一些对你的代码可伸缩性和可靠性有好处的东西。
1.使用CreateAPIView,你不需要为基本的创建函数进行装饰。

# views.py
class UserRegView(CreateAPIView):

    serializer_class = UserRegSerializer
    permission_classes = [AllowAny]

1.如果你需要验证,写在validate函数。你的响应可能会改变。然后,你应该改变你

# 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",
        }

1.现在,在as_view()中不需要任何参数。

# urls.py
urlpatterns = [
    path("user_new", UserRegView.as_view()),
]

相关问题