标签: drf-yasg

使用 django 和 drf-yasg 重用序列化程序的问题

我正在使用 django、django drf 和 drf-yasg 来生成编写我的 BE 并生成文档。

我有一个名为 User 的模型和一个用于用户的序列化程序:

class UserSerializer(serializers.ModelSerializer):

    class Meta:
        model = users_models.User
        fields = (users_models.User.first_name.field_name,
                  users_models.User.last_name.field_name,)
Run Code Online (Sandbox Code Playgroud)

我有一些方法 Foo 可以获得两个用户。这是请求的序列化程序的样子:

class FooRequestSerializer(serializers.ModelSerializer):
      first_user = UserSerializer(help_text="first user")
      second_user = UserSerializer(help_text="second user")
Run Code Online (Sandbox Code Playgroud)

当我为此生成一个swagger json方案时,我查看了json和redoc,我看到了:

  1. first_user 和 second_user 具有相同的引用名称 ($ref)
  2. second_user 和 redoc 的描述为“第一个用户”而不是第二个用户。这是因为描述取自具有第一个用户描述的 $ref。

我注意到如果我确保 ref 名称是不同的,那么 redoc 读起来很好,因为 first_user 和 second_user 得到了他们自己的描述。问题来了,因为我也希望以后能够使用 swagger codegen 来创建 Java 存根,所以解决方案和据我所知,每个不同的 ref 名称都有一个不同的类。理想情况下,我会看到对 foo 的调用类似于

Foo(User first_user, User second_user)
Run Code Online (Sandbox Code Playgroud)

这让我想到了一个问题:

  • 如果 first_user 和 second_user 具有相同的引用名称,则 redoc 读取错误并且第二个用户具有第一个用户描述。
  • 如果 first_user 和 …

django swagger django-rest-framework drf-yasg redoc

7
推荐指数
1
解决办法
3070
查看次数

Django Rest框架drf-yasg swagger ListField序列化器的多个文件上传错误

我正在尝试从swagger(使用drf-yasg)进行上传文件输入,但是当我使用MultiPartParser类时,它给了我以下错误:

drf_yasg.errors.SwaggerGenerationError: FileField is supported only in a formData Parameter or response Schema
Run Code Online (Sandbox Code Playgroud)

我的看法:

drf_yasg.errors.SwaggerGenerationError: FileField is supported only in a formData Parameter or response Schema
Run Code Online (Sandbox Code Playgroud)

我的序列化器:

class AddExperience(generics.CreateAPIView):
    parser_classes = [MultiPartParser]

    permission_classes = [IsAuthenticated]
    serializer_class = DoctorExperienceSerializer
Run Code Online (Sandbox Code Playgroud)

我也尝试过FormParser,但它仍然给我同样的错误。另外:FileUploadParser解析器但它的工作原理如下JsonParser

python django python-3.x django-rest-framework drf-yasg

7
推荐指数
1
解决办法
1768
查看次数

这些参数在 swagger_auto_schema (Django) 中是什么意思?

该项目使用了招摇。有以下代码。

@swagger_auto_schema(
        manual_parameters=[
            Parameter('download', IN_QUERY,
                      'Set `Content-Disposition=attachment` to make browser to download file'
                      'instead of showing it.',
                      type='bool'),
            Parameter('share_id', IN_PATH, type='uuid')
        ],
        security=[],
        responses={'400': 'Validation Error (e.g. base64 is wrong)',
                   '200': VideoSerializer}
    )
Run Code Online (Sandbox Code Playgroud)

请解释每个论点的责任。我阅读了文档,但了解的很少......特别感兴趣'200': VideoSerializer

django swagger django-rest-framework drf-yasg

6
推荐指数
1
解决办法
4037
查看次数

drf-yasg 提供了错误的 URI 路径

在我的应用程序中,我需要有多个 Swagger 页面,其中包含多个客户端的分组端点。

我的一个客户端(路径)提供移动应用程序 API,另一个提供 Web 客户端 API。URL 模式相应地保持在 2 种不同中urls.py

我正在使用drf-yasg为我的 API 生成模式。

为了生成swagger规范,我schema_views为每个urls.py文件分别初始化 2 个,如下所示:

from api_mobile.urls import urlpatterns as mobile_patterns
from api_web.urls import urlpatterns as web_patterns

mobile_schema_view = get_schema_view(
openapi.Info(
    title="Mobile API",
    default_version='v3',
),
public=True,
permission_classes=(permissions.AllowAny,),
patterns=mobile_patterns,
)

web_schema_view = get_schema_view(
    openapi.Info(
        title="Web API",
        default_version='v1',
    ),
    public=True,
    permission_classes=(permissions.AllowAny,),
    patterns=web_patterns,
)

urlpatterns = [
    path(
        'api/mobile/docs',
        mobile_schema_view.with_ui('swagger', cache_timeout=0),
        name='mobile-schema-ui'
    ),
    path(
        'api/web/docs',
        web_schema_view.with_ui('swagger', cache_timeout=0),
        name='web-schema-ui'
    ),

    path('api/mobile/v3/', include('api_mobile.urls'), …
Run Code Online (Sandbox Code Playgroud)

django swagger django-rest-framework openapi drf-yasg

6
推荐指数
1
解决办法
3316
查看次数

当我点击 /swagger url 时出现“AssertionError:duplicate Parameters found”

我正在我的项目中使用drf-yasg为 django rest 框架 API实现 swagger 。

我遵循 drf-yasg 的快速入门部分。当我点击 /swagger 时,得到 AssertionError:发现重复参数。下面是我的代码和回溯。

网址.py

from drf_yasg.views import get_schema_view
from drf_yasg import openapi

schema_view = get_schema_view(
   openapi.Info(
      title="Snippets API",
      default_version='v1',
      description="Test description",
      terms_of_service="https://www.google.com/policies/terms/",
      contact=openapi.Contact(email="contact@snippets.local"),
      license=openapi.License(name="BSD License"),
   ),
   public=True,
   permission_classes=(permissions.AllowAny,),
)

urlpatterns = [
    url(r'^swagger(?P<format>\.json|\.yaml)$', schema_view.without_ui(cache_timeout=0), name='schema-json'),
    url(r'^swagger/$', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'),
    url(r'^redoc/$', schema_view.with_ui('redoc', cache_timeout=0), name='schema-redoc'),
    # path('graphql', csrf_exempt(GraphQLObservableUnboxingView.as_view(graphiql=True, schema=schema))),
]
Run Code Online (Sandbox Code Playgroud)

追溯


```Traceback (most recent call last):
  File "/home/abc/development/sw_api/env_sw_api_python3.7/lib/python3.7/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/home/abc/development/sw_api/env_sw_api_python3.7/lib/python3.7/site-packages/django/core/handlers/base.py", line 115, in …
Run Code Online (Sandbox Code Playgroud)

django swagger django-rest-framework drf-yasg

6
推荐指数
1
解决办法
608
查看次数

Django 2.x drf-yasg 如何在自定义方法中创建 API(如 swagger)

我正在将我的 Django 1.11.7 迁移到 2.x。问题之一是 django-rest-swagger,它现在已被弃用。drf-yasg 现在应该是 API 文档和创建的方式。我需要以类似的方式创建自定义 api,这样它就不会破坏移动设备中的任何内容。

以前是这样的(django-rest-swagger==2.1.1)

旧的已弃用的 swagger 2.1.1 这是在 Django 1.11.7 和 django-rest-swagger==2.1.1 中运行良好的旧代码片段:

using swagger_schema.py
https://gist.github.com/axilaris/2f72fef8f30c56d5befe9e31cd76eb50


in url.py:

from rest_framework_swagger.views import get_swagger_view
from myapp.swagger_schema import SwaggerSchemaView


urlpatterns = [  
   url(r'^swaggerdoc/', SwaggerSchemaView.as_view()),
   url(r'^api/v1/general/get_countries$', api.get_countries, name='get_countries'),


in api.py:
@api_view(['POST'])
def get_countries(request):
    # ----- YAML below for Swagger -----
    """
    description: countries list
    parameters:
      - name: token
        type: string
        required: true
        location: form   
    """
    ......
    return Response(countries_list, status=status.HTTP_200_OK)
Run Code Online (Sandbox Code Playgroud)

我的问题是如何在 drf-yasg 中进行类似的操作,因为我想迁移此代码并且不要破坏移动设备上的任何内容。

可能尝试在最新的稳定版本上执行此操作:

djangorestframework==3.9
drf-yasg==1.16.1
Run Code Online (Sandbox Code Playgroud)

python django swagger django-rest-framework drf-yasg

5
推荐指数
1
解决办法
3088
查看次数

如何在 drf-yasg 库中添加自己的参数和响应值以用于 swagger 文档?

我使用drf-yasg库为开发人员前端生成项目文档。我不知道如何将数据添加到参数响应字段

例如,这个类

class VendorsCreateView(APIView):
    """
    :param:
            data = {
            "vendor_name": "TestName",
            "country": "Belarus",
            "nda": "2020-12-12",
            "parent": "",
            "contacts": [{"contact_name": "Mrk", "phone": "2373823", "email": "dRqT@rgmail.com"},
                         {"contact_name": "Uio", "phone": "34567", "email": "rdq@gmail.com"}
                         ]
        }
    :return: swagger name
    """
Run Code Online (Sandbox Code Playgroud)

但我并没有完全得到我想要的 在此输入图像描述

如何添加这些参数?

django-rest-framework drf-yasg

5
推荐指数
2
解决办法
8341
查看次数

如何禁用/删除 swagger drf_yasg 中的授权按钮(维护 CSRF)-django

如何禁用 drf_yasg 中的授权按钮?(我仍然希望 CSRF 起作用)

在此输入图像描述

更新:目前,我有这样的设置,因为我想删除 Django 登录并维护 csrf。但是,授权按钮仍然存在(如何删除授权按钮并维护csrf)

SWAGGER_SETTINGS = {
    'USE_SESSION_AUTH': False,

    'SECURITY_DEFINITIONS': {
        'Basic': {
            'type': 'basic'
        },
    },
}
Run Code Online (Sandbox Code Playgroud)

django csrf swagger django-rest-framework drf-yasg

5
推荐指数
1
解决办法
3981
查看次数

如何设置drf-yasg中路径参数的数据类型

我使用DjangoDRFdrf-yasgSwagger Codegen自动构建 TypeScript 代码来访问我的 REST API。

在 Django 后端中,我添加了一条与 DRF 一起提供服务的路径:

rest_router = routers.DefaultRouter()
rest_router.register(r'source/(?P<source_id>[0-9]+)/document', DocumentViewSet)
Run Code Online (Sandbox Code Playgroud)

DocumentViewSet是一个 DRF ModelViewSet

可以看到,source_id参数是数字类型。但是,生成的 API 描述将source_id参数定义为 String 类型。

显然路径设置中的数字正则表达式是不够的,所以我想我需要在类中使用一些类型注释DocumentViewSet?我尝试了以下代码,但这没有效果:

@swagger_auto_schema(
    manual_parameters=[
        openapi.Parameter(name="source_id",
            required=True,
            type="integer",
            in_="path",
            description="Source reference",
        ),
    ],
)
class DocumentViewSet(viewsets.ModelViewSet):
    serializer_class = rest_serializers.DocumentSerializer
    queryset = models.Document.objects.all().order_by('id')
Run Code Online (Sandbox Code Playgroud)

如何告诉 drf-yasg 将source_id参数设置为 Integer 类型?

django django-rest-framework drf-yasg

5
推荐指数
1
解决办法
4134
查看次数

DRF 序列化器字段未显示在 Openapi 架构中

我使用drf-yasg 包为我的 DRF API设置了 openapi ,但由于某种原因,我的文档中 POST 或 PUT 的所有端点都没有显示所需的必要字段。我如何设置它以显示将数据发送到 API 所需的必要字段,目前它们没有显示在架构中以及为 API 生成的文档中

这是我的代码

#项目级别的urls.py

from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static
from rest_framework import permissions # new
from drf_yasg.views import get_schema_view # new
from drf_yasg import openapi # new


schema_view = get_schema_view( # new
    openapi.Info(
        title="Blog API",
        default_version="v1",
        description="API for CaseMed Insurance",
        terms_of_service="https://www.google.com/policies/terms/",
        contact=openapi.Contact(email="hello@example.com"),
        license=openapi.License(name="BSD License"),
    ),
        public=True,
        permission_classes=(permissions.AllowAny,),
)



urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/auth/', include('user.urls')), …
Run Code Online (Sandbox Code Playgroud)

django-rest-framework drf-yasg

5
推荐指数
1
解决办法
1490
查看次数