drf_yasg swagger_auto_schema从视图中移动

bxgwgixi  于 2022-11-06  发布在  其他
关注(0)|答案(1)|浏览(241)

在我的项目的视图类中,我使用swagger_auto_schema装饰器来定制swagger可能的响应。我的问题是:“这是一种将所有这些装饰器从我的基于类的视图移动到其他位置(如模块或python文件)的方法吗?".我问这个问题是因为swagger_auto_schema装饰器有时会占用我视图的大部分代码,并且阅读它们变得越来越困难。
例如:

  1. class ArticleListCreateAPIView(ListCreateAPIView):
  2. queryset = Article.objects.all()
  3. serializer_class = ArticleSerializer
  4. def get_serializer_class(self):
  5. if self.request.method == "GET":
  6. return ArticleResponseSerializer
  7. return super().get_serializer_class()
  8. @swagger_auto_schema(
  9. responses={
  10. status.HTTP_201_CREATED: openapi.Response(
  11. description="Successful article create",
  12. schema=ArticleResponseSerializer,
  13. ),
  14. status.HTTP_400_BAD_REQUEST: openapi.Response(
  15. description="Data serialization failed. Incorrect data.",
  16. schema=DetailResponseSerializer
  17. ),
  18. status.HTTP_409_CONFLICT: openapi.Response(
  19. description="Media-file is already bouned to some other model",
  20. schema=DetailResponseSerializer
  21. )
  22. }
  23. )
  24. def post(self, request, *args,**kwargs):
  25. ...

也许我应该停止使用swagger_auto_schema并用其他结构来代替它?

sqyvllje

sqyvllje1#

我的解决方案是将responses parts、responses和swagger_auto_schema分别放在3个不同的地方。在我的项目根目录下,我创建了utils文件夹,在其中我以如下方式存储文件:

  1. utils
  2. ├── __init__.py
  3. ├── ...
  4. └── swagger
  5. ├── __init__.py
  6. ├── generators.py <---- http/https schema for swagger
  7. ├── response_templates.py <---- templates of swagger_auto_schema response parts
  8. └── serializers.py <---- some general response serializers

response_templates.py中有以下代码:

  1. from drf_yasg import openapi
  2. from rest_framework import status
  3. from .serializers import DetailResponseSerializer, TaskRequestSerializer
  4. FILE_SUCCESS_200 = {
  5. status.HTTP_200_OK: openapi.Response(
  6. description="Correct file get",
  7. schema=openapi.Schema(type=openapi.TYPE_FILE),
  8. ),
  9. }
  10. TASK_CREATED_201 = {
  11. status.HTTP_201_CREATED: openapi.Response(
  12. description="Successfully task created",
  13. schema=TaskRequestSerializer,
  14. ),
  15. }
  16. ... # and other

因此,我可以在我的swagger_auto_schema装饰器中使用这些响应部分。下一步是在所有应用程序中创建responses文件夹,那些需要在swagger.tree of responses文件夹中自定义响应的应用程序:

  1. responses
  2. ├── __init__.py
  3. ├── image.py
  4. └── and_other_models_name_files.py

image.py中有以下代码:

  1. from utils.swagger.response_templates import (
  2. TASK_CREATED_201, FILE_SUCCESS_200, CREATED_201, SERIALIZE_400, NOT_FOUND_404,
  3. LARGE_ENTITY_413, INVALID_FILE_FORMAT_415, SERVER_STORAGE_500
  4. )
  5. image_list_responses = {
  6. **TASK_CREATED_201,
  7. **SERIALIZE_400,
  8. **LARGE_ENTITY_413,
  9. **INVALID_FILE_FORMAT_415,
  10. }
  11. image_detail_responses = {
  12. **FILE_SUCCESS_200,
  13. **NOT_FOUND_404,
  14. **SERVER_STORAGE_500
  15. }

因此,作为上述重构的结果,我可以在swagger_auto_schema装饰器中使用上述响应。

  1. from media_app.responses import image_detail_responses
  2. class DetailDownloadAPIView(RetrieveDestroyAPIView):
  3. @swagger_auto_schema(responses=image_detail_responses)
  4. def get(self, request, *args,**kwargs):
  5. ...
  6. ...
展开查看全部

相关问题