【问题标题】:Problem to use @extend_schema over an @actoin in DRF在 DRF 中通过 @actoin 使用 @extend_schema 的问题
【发布时间】:2022-01-02 21:10:13
【问题描述】:

嗨,我的代码中有一个 drf_spectacular 库的 @extend_schema 我需要在我的 @action 上使用它来自定义其中的细节OpenAPI,但我收到类似的错误

Internal Server Error: /api/schema/
Traceback (most recent call last):
  File "/mnt/62EE2B18EE2AE44F/NEW/django/webserver/django-env/lib/python3.9/site-packages/asgiref/sync.py", line 482, in thread_handler
    raise exc_info[1]
  File "/mnt/62EE2B18EE2AE44F/NEW/django/webserver/django-env/lib/python3.9/site-packages/django/core/handlers/exception.py", line 38, in inner
    response = await get_response(request)
  File "/mnt/62EE2B18EE2AE44F/NEW/django/webserver/django-env/lib/python3.9/site-packages/django/core/handlers/base.py", line 233, in _get_response_async
    response = await wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/mnt/62EE2B18EE2AE44F/NEW/django/webserver/django-env/lib/python3.9/site-packages/asgiref/sync.py", line 444, in __call__
    ret = await asyncio.wait_for(future, timeout=None)
  File "/usr/lib/python3.9/asyncio/tasks.py", line 442, in wait_for
    return await fut
  File "/usr/lib/python3.9/concurrent/futures/thread.py", line 52, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/mnt/62EE2B18EE2AE44F/NEW/django/webserver/django-env/lib/python3.9/site-packages/asgiref/sync.py", line 486, in thread_handler
    return func(*args, **kwargs)
  File "/mnt/62EE2B18EE2AE44F/NEW/django/webserver/django-env/lib/python3.9/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "/mnt/62EE2B18EE2AE44F/NEW/django/webserver/django-env/lib/python3.9/site-packages/django/views/generic/base.py", line 70, in view
    return self.dispatch(request, *args, **kwargs)
  File "/mnt/62EE2B18EE2AE44F/NEW/django/webserver/django-env/lib/python3.9/site-packages/rest_framework/views.py", line 509, in dispatch
    response = self.handle_exception(exc)
  File "/mnt/62EE2B18EE2AE44F/NEW/django/webserver/django-env/lib/python3.9/site-packages/rest_framework/views.py", line 469, in handle_exception
    self.raise_uncaught_exception(exc)
  File "/mnt/62EE2B18EE2AE44F/NEW/django/webserver/django-env/lib/python3.9/site-packages/rest_framework/views.py", line 480, in raise_uncaught_exception
    raise exc
  File "/mnt/62EE2B18EE2AE44F/NEW/django/webserver/django-env/lib/python3.9/site-packages/rest_framework/views.py", line 506, in dispatch
    response = handler(request, *args, **kwargs)
  File "/mnt/62EE2B18EE2AE44F/NEW/django/webserver/django-env/lib/python3.9/site-packages/drf_spectacular/views.py", line 69, in get
    return self._get_schema_response(request)
  File "/mnt/62EE2B18EE2AE44F/NEW/django/webserver/django-env/lib/python3.9/site-packages/drf_spectacular/views.py", line 77, in _get_schema_response
    data=generator.get_schema(request=request, public=self.serve_public),
  File "/mnt/62EE2B18EE2AE44F/NEW/django/webserver/django-env/lib/python3.9/site-packages/drf_spectacular/generators.py", line 262, in get_schema
    paths=self.parse(request, public),
  File "/mnt/62EE2B18EE2AE44F/NEW/django/webserver/django-env/lib/python3.9/site-packages/drf_spectacular/generators.py", line 227, in parse

   assert isinstance(view.schema, AutoSchema), (
AssertionError: Incompatible AutoSchema used on View <class 'WEB_SERVER.api_v1.views.Device'>. Is DRF's DEFAULT_SCHEMA_CLASS pointing to "drf_spectacular.openapi.AutoSchema" or any other drf-spectacular compatible AutoSchema?
HTTP GET /api/schema/ 500 [0.10, 127.0.0.1:51558]

这是我的代码:

    @extend_schema(summary="short summary")
    @action(detail=True, methods=["GET"], url_name="command")
    def command(self, request, pk) -> Union[Response, Http404]:  # Retrieve Command

        data = request.data
        status = get_object_or_404(Command_Model, device=pk)
        serializer = Serializer_Command(status)
        return Response(serializer.data, status=Status.HTTP_200_OK)

    @command.mapping.post
    def command_create(self, request, pk) -> Response:
        data = request.data.copy()
        data["device"] = pk
        command_instace = None
        try:
            command_instace = Command_Model.objects.get(device=pk)
        except:
            pass
        serializer = Serializer_Command(
            instance=command_instace, data=data, partial=True
        )
        if serializer.is_valid(raise_exception_validitor):
            serializer.save()
            return Response(data=serializer.data, status=Status.HTTP_201_CREATED)
        return Response(status=status.HTTP_400_BAD_REQUEST)

我尝试将装饰器移到 @action 的下方,但不起作用 @extend_schema 实际上我没有收到任何错误,但在 OpenAPI 中它不起作用

当我从我的代码中删除 @command.mapping.post 时,它的效果也很好

【问题讨论】:

    标签: python django swagger openapi drf-spectacular


    【解决方案1】:

    我通过向其他额外端点添加更多@extend_schema解决了这个问题,如果你没有这样做的话得到一个像我这样的错误

        @extend_schema(summary="short summary")
        @action(detail=True, methods=["GET"], url_name="command")
        def command(self, request, pk) -> Union[Response, Http404]:  # Retrieve Command
            data = request.data
            status = get_object_or_404(Command_Model, device=pk)
            serializer = Serializer_Command(status)
            return Response(serializer.data, status=Status.HTTP_200_OK)
    
        @extend_schema(summary="short summary")
        @command.mapping.post
        def command_create(self, request, pk) -> Response:
            data = request.data.copy()
            data["device"] = pk
            command_instace = None
            try:...
    

    【讨论】:

      猜你喜欢
      • 2021-08-11
      • 2020-12-10
      • 2021-04-16
      • 1970-01-01
      • 2016-05-17
      • 1970-01-01
      • 2019-03-29
      • 1970-01-01
      • 2021-10-09
      相关资源
      最近更新 更多